Могу ли я сохранить нечисловые столбцы (1-е появившееся значение) при выполнении pandas.DataFrame.groupby (). Sum ()?
Например, у меня есть такой DataFrame:
df = pd.DataFrame({'A' : ['aa1', 'aa2', 'aa1', 'aa2'],'B' : ['bb1', 'bbb1', 'bb2', 'bbb2'],'C' : ['cc1', 'ccc2', 'ccc3', 'ccc4'],'D' : [1, 2, 3, 4],'E' : [1, 2, 3, 4]})
>>> df
A B C D E
0 aa1 bb1 cc1 1 1
1 aa2 bbb1 ccc2 2 2
2 aa1 bb2 ccc3 3 3
3 aa2 bbb2 ccc4 4 4
>>> df.groupby(["A"]).sum()
D E
A
aa1 4 4
aa2 6 6
Вот результат, который я хочу получить:
B C D E
A
aa1 bb1 cc1 4 4
aa2 bbb1 ccc2 6 6
Обратите внимание, что значение столбца B
и C
является первым связанным значением B и значением C каждого ключа группы.
4 ответа
Для каждого ключа в фрейме данных groupby-sum найдите ключ в исходном фрейме данных и поместите соответствующее значение столбца B
в новый столбец.
#groupby and sum over columns C and D
df_1 = df.groupby(['A']).sum()
Найти первые значения в столбце B, связанные с групповыми ключами
groupby keys
col_b = []
#iterate through keys and find the the first value in df['B'] with that key in column A
for i in df_1.index:
col_b.append(df['B'][df['A'] == i].iloc[0])
#insert list of values into new dataframe
df_1.insert(0, 'B', col_b)
>>>df_1
B D E
A
aa1 bb1 4 4
aa2 bbb1 6 6
Группировка только по столбцу «А» дает:
df.groupby(['A']).sum()
C D
A
bar 1.26 0.88
foo 0.92 -4.19
Группировка по столбцам «А» и «В» дает:
df.groupby(['A','B']).sum()
C D
A B
bar one 1.38 -0.73
three 0.26 0.80
two -0.38 0.81
foo one 1.96 -2.72
three -0.42 -0.18
two -0.62 -1.29
Если вы хотите только столбец «B», который имеет «один», вы можете сделать:
d = df.groupby(['A','B'], as_index=False).sum()
d[d.B=='one'].set_index('A')
B C D
A
bar one 1.38 -0.73
foo one 1.96 -2.72
Я не уверен, что понимаю, но это то, что вы хотите сделать? Примечание: я увеличил точность вывода только для того, чтобы получить те же цифры, что и в посте.
d = df.groupby('A').sum()
d['B'] = 'one'
d.sort_index(axis=1)
B C D
A
bar one 1.259069 0.876959
foo one 0.921510 -4.193397
Если вы хотите поместить первое отсортированное значение столбца из 'B', вы можете использовать:
d['B'] = df.B.sort(inplace=False)[0]
Итак, здесь я заменил «один», «два», «три» на «a», «b», «c», чтобы увидеть, действительно ли это то, что вы пытаетесь сделать, и использовал метод insert (), как было предложено в другом посте.
df
A B C D
0 foo a 0.638362 -0.931817
1 bar a 1.380706 -0.733307
2 foo b -0.324514 0.203515
3 bar c 0.258534 0.803298
4 foo b -0.299485 -1.495979
5 bar b -0.380171 0.806968
6 foo a 1.324810 -1.792996
7 foo c -0.417663 -0.176120
d = df.groupby('A').sum()
d.insert(0, 'B', df.B.sort(inplace=False)[0])
d
B C D
A
bar a 1.259069 0.876959
foo a 0.921510 -4.193397
Просто используйте «сначала»:
df.groupby(["A"]).agg({'B': 'first',
'C': 'first',
'D': sum,
'E': sum})
Все эти ответы кажутся довольно многословными; Документ Pandas [1] также не совсем ясен по этому вопросу, несмотря на то, что на первой странице приведен пример SQL:
SELECT Column1, Column2, mean(Column3), sum(Column4)
FROM SomeTable
GROUP BY Column1, Column2
Который выберет «первое» из Column1, Column2, а Pandas - нет. Как указывает OP, нечисловые столбцы просто удаляются. Мое решение тоже не очень красивое, но, возможно, больше контроля - цель дизайна Pandas:
agg_d = { c: 'sum' if c == 'A' else 'first' for c in df.columns }
df = df.groupby( df['A'] ).agg( agg_d )
Это поддерживает все нечисловые столбцы, как это делает sql. Это в основном совпадает с ответом Филиппа ниже, но без необходимости явно перечислять столбцы.
ПРИМЕЧАНИЯ
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.