2016-02-08 2 views
4

У меня есть dataframe, который выглядит какКак суммировать много столбцов с группой pandas?

day type col d_1 d_2 d_3 d_4 d_5... 
1 A  1 1 0 1 0 
1 A  2 1 0 1 0 
2 B  1 1 1 0 0 

То есть, у меня есть один нормальный столбец (столбец) и количество столбцов префиксом D_

Мне нужно выполнить GroupBy днем ​​и типа, и я хочу для вычисления суммы значений в каждом столбце d_ для каждой комбинации дневного типа. Я также должен выполнять другие функции агрегации на другие столбцы в моих данных (например, col в примере)

можно использовать:

agg_df=df.groupby(['day','type']).agg({'d_1': 'sum', 'col': 'mean'}) 

но это вычисляет сумму только для одного столбца D_. Как я могу указать все возможные столбцы d_ в моих данных?

Другими словами, я хотел бы написать что-то вроде

agg_df=df.groupby(['day','type']).agg({'d_*': 'sum', 'col': 'mean'}) 

так, что ожидаемый результат:

day type col d_1 d_2 d_3 d_4 d_5... 
1 A  1.5 2 0 2 0 ... 
2 B  1 1 1 0 0 

Как вы можете видеть, цв агрегируется среднего значения, в то время как d_ столбцы суммируются.

Благодарим за помощь!

+1

Каков ваш ожидаемый результат? –

+1

Я действительно не понимаю, вам не нужно просто 'df.groupby (['day', 'type'], as_index = False) .sum()'? –

+0

нет, потому что у меня есть много других столбцов в данных. Я просто хочу их суммировать. Я выполняю другие функции агрегации в других столбцах. –

ответ

4

Вы можете использовать filter:

In [23]: df.groupby(['day','type'], as_index=False)[df.filter(regex='d_.*').columns].sum() 

Out[23]: 
    day type d_1 d_2 d_3 d_4 
0 1 A 2 0 2 0 
1 2 B 1 1 0 0 

Если вы хотите использовать все функции в одном кадре:

dic = {} 
dic.update({i:np.sum for i in df.filter(regex='d_.*').columns}) 
dic.update({'col':np.mean}) 

In [48]: df.groupby(['day','type'], as_index=False).agg(dic) 
#Out[48]: 
# day type d_2 d_3 d_1 col d_4 
#0 1 A 0 2 2 1.5 0 
#1 2 B 1 0 1 1.0 0 
+0

, это большая благодарность, но тогда как я могу выполнять другие агрегации в других столбцах? Здесь я рассматриваю только столбцы d_. как насчет col? –

+1

нет в вашем основном вопросе .... –

+1

@Noobie считают, что добавить эту информацию на вопрос –

6

IIUC вам нужно подмножество вашего GroupBy dataframe с d_* колоннами. Вы можете обнаружить, что столбцы с str.contain и передать его GroupBy dataframe:

cols = df.columns[df.columns.str.contains('(d_)+|col')] 
agg_df=df.groupby(['day','type'])[cols].sum() 


In [150]: df 
Out[150]: 
    day type col d_1 d_2 d_3 d_4 
0 1 A 1 1 0 1 0 
1 1 A 2 1 0 1 0 
2 2 B 1 1 1 0 0 

In [155]: agg_df 
Out[155]: 
      col d_1 d_2 d_3 d_4 
day type 
1 A  3 2 0 2 0 
2 B  1 1 1 0 0 

Примечание: Я добавил col столбцы в contains шаблон, как вы просили. Вы можете указать любое выражение регулярного выражения, которое вы хотите, и передать его с помощью символа |.

+0

Hi @AntonProtopopov благодарит за это приятное решение. Однако я все еще не могу объединить другие столбцы с другими функциями с вашим решением. См. Мой отредактированный вопрос. Благодаря! –

+1

@Noobie Я думаю, вы могли бы сделать это отдельно, а затем использовать 'pd.concat' для объединения результатов с' axis = 1'. –

Смежные вопросы