#python #python-3.x #pandas #dataframe
#python #python-3.x #панды #фрейм данных
Вопрос:
У меня есть фрейм данных примерно так:
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
Но в фактическом наборе данных он пропускает несколько записей.
Если вы заметили, внутри фрейма данных есть некоторые различия в данных 2-го столбца для каждой записи (номер 1 в столбце 1 имеет 2 «a» и «x», а номер 2 имеет 2 «b» и «y»). Это связано с тем, что в фактическом наборе данных существуют незначительные различия между записями из-за ошибок и незначительных (но незначительных) различий в строковых данных.
Редактировать
Все вышесказанное является лишь концептуальным изложением проблемы. Если вам нужно что-то более осязаемое, то это набор данных. Я хочу группировать по "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.
Для пояснения, выводом должен быть фрейм данных с тремя столбцами. Первое — это имя клиента, второе — адрес, прикрепленный к имени клиента (первое подходит), третье — среднее значение транзакций этого клиента.
Комментарии:
1. Каков ваш ожидаемый результат?
2. После того, как вы groupby, на группу будет только одна запись. Таким образом, вы не можете просто так прикрепить значения 2-го столбца. Вы можете создать список значений 2-го столбца для каждой группы и прикрепить его к сгруппированному df.
3. @MayankPorwal это должен быть фрейм данных с тремя столбцами. Первое — это имя клиента, второе — адрес, прикрепленный к имени клиента (первое подходит), третье — среднее значение транзакций этого клиента.
4. Проверьте мой ответ, пожалуйста.
Ответ №1:
Если first
значение из 2
col в порядке, вы можете использовать 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