Могу ли я сохранить нечисловые столбцы (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 каждого ключа группы.

7
Aaron Wang 19 Дек 2015 в 10:07

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
4
ilyas patanam 19 Дек 2015 в 08:58

Группировка только по столбцу «А» дает:

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
4
Steve Misuta 19 Дек 2015 в 08:21

Просто используйте «сначала»:

df.groupby(["A"]).agg({'B': 'first',
                       'C': 'first',
                       'D': sum,
                       'E': sum})
3
Phillip Homer 20 Апр 2018 в 11:22

Все эти ответы кажутся довольно многословными; Документ 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. Это в основном совпадает с ответом Филиппа ниже, но без необходимости явно перечислять столбцы.

ПРИМЕЧАНИЯ

  1. https://pandas.pydata.org/pandas-docs/stable/groupby.html
1
FDS 20 Апр 2018 в 16:06