2016-04-29 162 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