2016-11-19 103 views
3

我想在pandas数据框上使用groupby,但我想获得某些列的平均值和其他值的总和。比方说,我们有以下数据框:如何将不同的功能应用到熊猫数据框上的不同列上

ID A B C 
1 1 1 0 
1 2 3 1 
1 3 6 1 
4 3 2 1 
4 4 1 0 
6 5 1 0 
6 6 6 1 
6 7 2 0 

我想GROUPBY ID并获得列“A”,在其他列的总和(其实我有超过40列)的平均值。

我想的结果是这样的:提前

ID A B C 
1 2 10 2 
4 3.5 3 1 
6 6 9 1 

感谢。

回答

7

你能做到这样:

数据:

In [127]: df = pd.DataFrame(np.random.randint(0,10, (7,6)), columns=list('ABCDEF')) 
    ...: df['ID'] = np.random.choice([1,2], len(df)) 
    ...: 

In [128]: df 
Out[128]: 
    A B C D E F ID 
0 7 7 2 2 3 0 1 
1 8 4 1 3 6 8 1 
2 4 7 7 2 8 4 2 
3 5 9 3 6 6 1 1 
4 4 6 1 7 4 6 2 
5 4 5 3 8 7 6 2 
6 8 4 1 8 1 0 1 

解决方案:

In [129]: fnc = {c:'sum' for c in df.columns.drop(['ID','A'])} 
    ...: fnc['A'] = 'mean' 
    ...: 

In [130]: fnc 
Out[130]: {'A': 'mean', 'B': 'sum', 'C': 'sum', 'D': 'sum', 'E': 'sum', 'F': 'sum'} 

In [131]: df.groupby('ID').agg(fnc).reindex_axis(df.columns.drop('ID'), 1) 
Out[131]: 
    A B C D E F 
ID 
1 7 24 7 19 16 9 
2 4 18 11 17 19 16 
+2

是使用'.tolist()'真的有必要吗?你可以遍历'Index'对象很好,不是吗? –

+1

@ juanpa.arrivillaga,的确,谢谢! – MaxU

+1

作为进一步补充,您可以在OrderedDict中传递这些函数,以便将列的顺序保留在生成的DF中。 –

相关问题