大熊猫枢纽和垂直多行总结

时间:2016-05-13 05:21:08

标签: python-3.x pandas aggregate-functions pivot-table

给出以下数据框:

import numpy as np
import pandas as pd
df = pd.DataFrame({'Site':['a','a','a','b','b','b'],
                   'x':[1,1,0,1,0,0],
                   'y':[1,np.nan,0,1,1,0]
                   })

df

    Site    y   x
0   a      1.0  1
1   a      NaN  1
2   a      0.0  0
3   b      1.0  1
4   b      1.0  0
5   b      0.0  0

我正在寻找最有效的方法,为每个数字列(y和x)生成每个组的百分比,标记列名,并将它们堆叠在一列中。 以下是我为' y'

完成此操作的方法
df=df.loc[~np.isnan(df['y'])] #do not count non-numbers
t=pd.pivot_table(df,index='Site',values='y',aggfunc=[np.sum,len])
t['Item']='y'
t['Perc']=round(t['sum']/t['len']*100,1)
t
    sum     len     Item    Perc
Site                
a   1.0     2.0     y       50.0
b   2.0     3.0     y       66.7

现在我需要的是一种向此添加2行的方法; ' x'的结果如果我使用上面的值进行调整,就像这样:

    sum     len     Item    Perc
Site                
a   1.0     2.0     y       50.0
b   2.0     3.0     y       66.7
a   1       2       x       50.0
b   1       3       x       33.3

实际上,我有48个这样的数值数据列,需要这样堆叠。

提前致谢!

1 个答案:

答案 0 :(得分:1)

首先,您可以使用notnull。然后通过新列valuepivot_table参数Itemstacksort_values中省略。最后,您可以使用pandas函数round

df=df.loc[df['y'].notnull()]

t=pd.pivot_table(df,index='Site', aggfunc=[sum,len])
    .stack()
    .reset_index(level=1)
    .rename(columns={'level_1':'Item'})
    .sort_values('Item', ascending=False)

t['Perc']= (t['sum']/t['len']*100).round(1)

#reorder columns
t = t[['sum','len','Item','Perc']]
print t
      sum  len Item  Perc
Site                     
a     1.0  2.0    y  50.0
b     2.0  3.0    y  66.7
a     1.0  2.0    x  50.0
b     1.0  3.0    x  33.3

另一种解决方案是否需要在pivot_table中定义值列:

df=df.loc[df['y'].notnull()]

t=pd.pivot_table(df,index='Site',values=['y', 'x'], aggfunc=[sum,len])
    .stack()
    .reset_index(level=1)
    .rename(columns={'level_1':'Item'})
    .sort_values('Item', ascending=False)

t['Perc']= (t['sum']/t['len']*100).round(1)
#reorder columns
t = t[['sum','len','Item','Perc']]
print t
      sum  len Item  Perc
Site                     
a     1.0  2.0    y  50.0
b     2.0  3.0    y  66.7
a     1.0  2.0    x  50.0
b     1.0  3.0    x  33.3