2016-04-29 143 views
0
df = pd.DataFrame({'a':['y',NaN,'y',NaN,NaN,'x','x','y',NaN],'b':[NaN,'x',NaN,'y','x',NaN,NaN,NaN,'y'],'d':[1,0,0,1,1,1,0,1,0]}) 

我想用sum来总结这个数据帧。我认为df.groupby(['a','b']).aggregate(sum)可以工作,但它会返回一个空的Series在熊猫中总结数据帧 - python

我该如何达到这个结果?

a b 
x 1 1 
y 2 1 
+0

@unutbu:对不起,你是对的,第二行应该是y 2 1.我编辑过它。 – HappyPy

回答

2
import numpy as np 
import pandas as pd 
NaN = np.nan 

df = pd.DataFrame(
    {'a':['y',NaN,'y',NaN,NaN,'x','x','y',NaN], 
    'b':[NaN,'x',NaN,'y','x',NaN,NaN,NaN,'y'], 
    'd':[32,12,55,98,23,11,9,91,3]}) 

melted = pd.melt(df, id_vars=['d'], value_vars=['a', 'b']) 
result = pd.pivot_table(melted, values='d', index=['value'], columns=['variable'], 
         aggfunc=np.median) 
print(result) 

产量

variable  a  b 
value    
x   10.0 17.5 
y   55.0 50.5 

说明

Melting the DataFramemelted = pd.melt(df, value_vars=['a', 'b'])产生

 d variable value 
0 32  a  y 
1 12  a NaN 
2 55  a  y 
3 98  a NaN 
4 23  a NaN 
5 11  a  x 
6 9  a  x 
7 91  a  y 
8 3  a NaN 
9 32  b NaN 
10 12  b  x 
11 55  b NaN 
12 98  b  y 
13 23  b  x 
14 11  b NaN 
15 9  b NaN 
16 91  b NaN 
17 3  b  y 

,现在我们可以用pd.pivot_table转动和聚集d值:

result = pd.pivot_table(melted, values='d', index=['value'], columns=['variable'], 
         aggfunc=np.median) 

注意,aggfunc可以采取的功能列表,如[np.sum, np.median, np.min, np.max, np.std]如果你想总结的方法不止一种数据。

+0

感谢您的回答!但是有没有办法让这个更灵活一点?例如,如果我有'd':[32,12,55,98,23,11,9,91,3]并且想要计算中位数而不是总和,它将无法工作。 – HappyPy

+0

是的 - 而不是'pd.crosstab'(它创建一个频率表),使用'pd.pivot_table'来选择'aggfunc'。 – unutbu

+0

完美,它的作品非常棒!非常感谢您的帮助和很好的解释! – HappyPy