Pandas и анализ DataFrame .csv файла
Подскажите как с помощью pandas отфильтрофать .csv файл с данными по алгоритму:
Пример исходного файла:
data | name | age | product |
---|---|---|---|
01.01.2020 2:59 | John | 18 | tomat |
01.01.2020 3:28 | Karl | 35 | tomat |
02.01.2020 1:58 | Karl | 35 | tomat |
02.01.2020 19:58 | Jet | 50 | banan |
03.01.2020 1:00 | John | 18 | tomat |
03.01.2020 1:00 | John | 18 | apple |
04.01.2020 15:45 | Jet | 50 | banan |
04.01.2020 10:15 | Jet | 50 | tomat |
10.01.2020 7:15 | Jet | 50 | tomat |
12.01.2020 9:00 | Kim | apple | |
15.01.2020 7:15 | Jet | 50 | tomat |
В таблице могут присутствовать пустые ячейки в столбце Age.
Готовое решение:
name | age | product | date | quantity |
---|---|---|---|---|
John | 18 | tomat | 01.01.2020 2:59, 03.01.2020 1:00 | 2 |
John | 18 | apple | 03.01.2020 1:00 | 1 |
Karl | 35 | tomat | 01.01.2020 3:28, 02.01.2020 1:58 | 2 |
Jet | 50 | banan | 02.01.2020 19:58, 04.01.2020 15:45 | 2 |
Jet | 50 | tomat | 04.01.2020 10:15, 10.01.2020 7:15, 15.01.2020 7:15 | 3 |
Kim | apple | 12.01.2020 9:00 | 1 |
С последующим импортом в тот же .csv или .xlsx
Ответы (2 шт):
Я вам покажу заготовку, вам её нужно будет допилить. Тут всё слишком просто, я так понимаю, это у вас задание, так вот всё-таки постарайтесь его выполнить самостоятельно.
Но прежде должен заметить:
- Это называется не фильтрация, а группировка
- Правильно поставить задачу - это половина дела, а то и 90% в каких-то случаях, написать код по хорошо поставленной задаче обычно не сложно
- Постановку задачи вы вообще не описали, но в общем тут можно догадаться
Просто группируем данные по колонкам Имя, Возраст и Продукт и потом аггрегируем.
import pandas as pd
from io import StringIO
data = """
data name age product
01.01.2020 2:59 John 18 tomat
01.01.2020 3:28 Karl 35 tomat
02.01.2020 1:58 Karl 35 tomat
02.01.2020 19:58 Jet 50 banan
03.01.2020 1:00 John 18 tomat
03.01.2020 1:00 John 18 apple
04.01.2020 15:45 Jet 50 banan
04.01.2020 10:15 Jet 50 tomat
10.01.2020 7:15 Jet 50 tomat
12.01.2020 9:00 Kim apple
15.01.2020 7:15 Jet 50 tomat"""
df = pd.read_csv(StringIO(data), sep='\t')
df.groupby(['name', 'age', 'product']).agg({'product': 'count', 'data': ', '.join})
Вывод:
product data
name age product
Jet 50.0 banan 2 02.01.2020 19:58, 04.01.2020 15:45
tomat 3 04.01.2020 10:15, 10.01.2020 7:15, 15.01.2020 ...
John 18.0 apple 1 03.01.2020 1:00
tomat 2 01.01.2020 2:59, 03.01.2020 1:00
Karl 35.0 tomat 2 01.01.2020 3:28, 02.01.2020 1:58
Вам нужно будет сделать самостоятельно:
- Результат аггрегации через
reset_index
сделать колонками - Переименовать колонку с количеством
Но основное я вам показал: группировка и аггрегация.
P.S. Неправильно сначала поставил разделитель, дата у вас уже нормальная, не нужно ничего склеивать )
Вот вам еще вариант с pivot_table
:
import pandas as pd
df = pd.read_csv("1.csv")
res = df.fillna("").pivot_table(index=["name","age","product"],
values=["data"], aggfunc=list
).reset_index()
res["quantity"] = res["data"].str.len()
res:
name age product data quantity
0 Jet 50.0 banan [02.01.2020 19:58, 04.01.2020 15:45] 2
1 Jet 50.0 tomat [04.01.2020 10:15, 10.01.2020 7:15, 15.01.2020... 3
2 John 18.0 apple [03.01.2020 1:00] 1
3 John 18.0 tomat [01.01.2020 2:59, 03.01.2020 1:00] 2
4 Karl 35.0 tomat [01.01.2020 3:28, 02.01.2020 1:58] 2
5 Kim apple [12.01.2020 9:00] 1
в столбце data
я оставил список - дальше сами разберетесь, что с ним делать, если вам нужна просто строка с данными через запятую.