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 шт):

Автор решения: CrazyElf

Я вам покажу заготовку, вам её нужно будет допилить. Тут всё слишком просто, я так понимаю, это у вас задание, так вот всё-таки постарайтесь его выполнить самостоятельно.

Но прежде должен заметить:

  • Это называется не фильтрация, а группировка
  • Правильно поставить задачу - это половина дела, а то и 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. Неправильно сначала поставил разделитель, дата у вас уже нормальная, не нужно ничего склеивать )

→ Ссылка
Автор решения: strawdog

Вот вам еще вариант с 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 я оставил список - дальше сами разберетесь, что с ним делать, если вам нужна просто строка с данными через запятую.

→ Ссылка