У меня есть такой фрейм данных:
df = pd.DataFrame({1:[1,1,1,2,2,2,3,4,5,6,7,8,9],
2:["a","a","x","b","b","y","c","d","e","f","g","h","i"],
3:[0.5,0.6,0.7,0.8,0.9,0.10,0.11,0.13,0.13,0.14,0.15,0.16,0.17]})
1 2 3
0 1 a 0.50
1 1 a 0.60
2 1 x 0.70
3 2 b 0.80
4 2 b 0.90
5 2 y 0.10
6 3 c 0.11
7 4 d 0.13
8 5 e 0.13
9 6 f 0.14
10 7 g 0.15
11 8 h 0.16
12 9 i 0.17
Я хочу:
Я могу сделать (1) и (2) следующим методом:
In [33]: df.groupby(1).mean()
Out[33]:
3
1
1 0.60
2 0.60
3 0.11
4 0.13
5 0.13
6 0.14
7 0.15
8 0.16
9 0.17
Однако я не уверен, как прикрепить второй столбец к группе.
Я пробовал группировать по нескольким столбцам:
In [34]: df.groupby([1,2]).mean()
Out[34]:
3
1 2
1 a 0.55
x 0.70
2 b 0.60
3 c 0.11
4 d 0.13
5 e 0.13
6 f 0.14
7 g 0.15
8 h 0.16
9 i 0.17
Но в фактическом наборе данных он пропускает несколько записей.
Если вы заметили, в фрейме данных есть некоторые различия в данных второго столбца для каждой записи (номер 1 в столбце 1 имеет 2 "а" и "х", а номер 2 имеет 2 "б" и "у") . Это связано с тем, что в фактическом наборе данных есть незначительные различия между записями из-за ошибок и незначительных (но незначительных) различий в строковых данных.
Редактировать
Вышеизложенное является лишь концептуальным изложением проблемы. Если вам нужно что-то более осязаемое, это набор данных. Я хочу сгруппировать по столбцам "CUSTOMERS NAME"
и "CUSTOMER ADDRESS"
при поиске среднего значения, но группировка по двум из них одновременно приводит к потере записей по какой-то причине. Если сгруппировать исключительно по "CUSTOMER NAME"
, то получится чуть более 4300 записей.
In [35]: len(ensemble.("CUSTOMERS NAME").mean())
Out[35]: 4376
Но если я сгруппирую как по имени, так и по адресу, он существенно упадет:
In [36]: len(ensemble.groupby(["CUSTOMERS NAME","CUSTOMER ADDRESS"]).mean())
Out[36]: 4154
Я знаю, что где-то что-то не так, потому что общее количество уникальных значений в столбцах "CUSTOMERS NAME"
равно 4376.
Для пояснения вывод должен быть фреймом данных с тремя столбцами. Первое — это имя клиента, второе — это адрес, связанный с именем клиента (с первым все в порядке), третье — это средства транзакций этого клиента.
После того, как вы сгруппируете, в каждой группе будет только одна запись. Таким образом, вы не можете просто так прикрепить значения второго столбца. Вы можете создать список значений второго столбца для каждой группы и прикрепить его к сгруппированному df.
@MayankPorwal это должен быть фрейм данных с тремя столбцами. Первое — это имя клиента, второе — это адрес, связанный с именем клиента (с первым все в порядке), третье — это средства транзакций этого клиента.
Проверьте мой ответ, пожалуйста.
Если значение first
из 2
столбца в порядке, вы можете использовать Groupby.agg:
In [583]: x = df.groupby(1, as_index=False).agg({2:'first', 3:'mean'})
In [584]: x
Out[584]:
1 2 3
0 1 a 0.60
1 2 b 0.60
2 3 c 0.11
3 4 d 0.13
4 5 e 0.13
5 6 f 0.14
6 7 g 0.15
7 8 h 0.16
8 9 I 0.17
ИЛИ, если вам нужны все значения, у вас может быть список:
In [586]: x = df.groupby(1, as_index=False).agg({2: list, 3:'mean'})
In [587]: x
Out[587]:
1 2 3
0 1 [a, a, x] 0.60
1 2 [b, b, y] 0.60
2 3 [c] 0.11
3 4 [d] 0.13
4 5 [e] 0.13
5 6 [f] 0.14
6 7 [g] 0.15
7 8 [h] 0.16
8 9 [i] 0.17
Каков ваш ожидаемый результат?