【问题标题】:summarizing data frame in pandas - python总结熊猫中的数据框 - python
【发布时间】:2016-04-29 19:47:25
【问题描述】:
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

我怎样才能达到这个结果?

   a  b
x  1  1
y  2  1

【问题讨论】:

  • @unutbu:对不起,你是对的,第二行应该是 y 2 1。我已经编辑过了。

标签: python pandas dataframe summary


【解决方案1】:
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_tabled 值进行透视和聚合:

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],如果您希望以多种方式汇总数据。

【讨论】:

  • 感谢您的回答!但是有没有办法让它更灵活一点?例如,如果我有 'd':[32,12,55,98,23,11,9,91,3] 并想计算中位数而不是总和,它就行不通了。
  • 是 -- 使用 pd.pivot_table 代替 pd.crosstab(创建频率表)并选择 aggfunc
  • 完美,效果很好!!非常感谢您的帮助和精彩的解释!
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多