python构建一个计算列表中位数的函数,如何通过agg函数(例如均值,中位数等)将摘要行添加到在多列计算的pandas DataFrame中...

对于给定的收集器,日期,样本和类型,我有一些具有多个观测值的数据,其中观测值因ID而异。

import StringIO

import pandas as pd

data = """Collector,Date,Sample,Type,ID,Value

Emily,2014-06-20,201,HV,A,34

Emily,2014-06-20,201,HV,B,22

Emily,2014-06-20,201,HV,C,10

Emily,2014-06-20,201,HV,D,5

John,2014-06-22,221,HV,A,40

John,2014-06-22,221,HV,B,39

John,2014-06-22,221,HV,C,11

John,2014-06-22,221,HV,D,2

Emily,2014-06-23,203,HV,A,33

Emily,2014-06-23,203,HV,B,35

Emily,2014-06-23,203,HV,C,13

Emily,2014-06-23,203,HV,D,1

John,2014-07-01,218,HV,A,35

John,2014-07-01,218,HV,B,29

John,2014-07-01,218,HV,C,13

John,2014-07-01,218,HV,D,1

"""

>>> df = pd.read_csv(StringIO.StringIO(data), parse_dates="Date")

在以这种长格式对数据进行图形处理后,我将其透视图转换为宽汇总表格式,其中每个ID都有列。

>>> table = df.pivot_table(index=["Collector", "Date", "Sample", "Type"], columns="ID", values="Value")

ID A B C D

Collector Date Sample Type

Emily 2014-06-20 201 HV 34 22 10 5

2014-06-23 203 HV 33 35 13 1

John 2014-06-22 221 HV 40 39 11 2

2014-07-01 218 HV 35 29 13 1

但是,我找不到一种简便的方法来计算一些摘要行并将其添加到宽格式数据中,并且将平均值,中位数以及也许一些自定义聚合函数应用于每个基于ID的列。这就是我要结束的事情:

ID Collector Date Sample Type A B C D

0 Emily 2014-06-20 201 HV 34 22 10 5

2 John 2014-06-22 221 HV 40 39 11 2

1 Emily 2014-06-23 203 HV 33 35 13 1

3 John 2014-07-01 218 HV 35 29 13 1

4 mean 35.5 31.3 11.8 2.3

5 median 34.5 32.0 12.0 1.5

我尝试了诸如调用mean或median在汇总表上进行操作,但最终得到了一个Series而不是可以连接到汇总表的一行。我想要的摘要行有点像数据透视表的页边空白,但聚合函数不是sum。

>>> table.mean()

ID

A 35.50

B 31.25

C 11.75

D 2.25

dtype: float64

>>> table.median()

ID

A 34.5

B 32.0

C 12.0

D 1.5

dtype: float64

解决方案

您可以aggfunc=[np.mean, np.median]用来计算均值和中位数。然后,您还可以用于margins=True获取每一列和每一行的均值和中位数。

result = df.pivot_table(index=["Collector", "Date", "Sample", "Type"],

columns="ID", values="Value", margins=True,

aggfunc=[np.mean, np.median]).stack(level=0)

产量

ID A B C D All

Collector Date Sample Type

Emily 2014-06-20 201 HV mean 34.0 22.00 10.00 5.00 17.7500

median 34.0 22.00 10.00 5.00 16.0000

2014-06-23 203 HV mean 33.0 35.00 13.00 1.00 20.5000

median 33.0 35.00 13.00 1.00 23.0000

John 2014-06-22 221 HV mean 40.0 39.00 11.00 2.00 23.0000

median 40.0 39.00 11.00 2.00 25.0000

2014-07-01 218 HV mean 35.0 29.00 13.00 1.00 19.5000

median 35.0 29.00 13.00 1.00 21.0000

All mean 35.5 31.25 11.75 2.25 20.1875

median 34.5 32.00 12.00 1.50 17.5000

是的,result包含的数据超出了您的要求,但是

result.loc['All']

具有其他值:

ID A B C D All

Date Sample Type

mean 35.5 31.25 11.75 2.25 20.1875

median 34.5 32.00 12.00 1.50 17.5000

或者,您可以进一步子选择result以仅获取要查找的行:

result.index.names = [u'Collector', u'Date', u'Sample', u'Type', u'aggfunc']

mask = result.index.get_level_values('aggfunc') == 'mean'

mask[-1] = True

result = result.loc[mask]

print(result)

产量

ID A B C D All

Collector Date Sample Type aggfunc

Emily 2014-06-20 201 HV mean 34.0 22.00 10.00 5.00 17.7500

2014-06-23 203 HV mean 33.0 35.00 13.00 1.00 20.5000

John 2014-06-22 221 HV mean 40.0 39.00 11.00 2.00 23.0000

2014-07-01 218 HV mean 35.0 29.00 13.00 1.00 19.5000

All mean 35.5 31.25 11.75 2.25 20.1875

median 34.5 32.00 12.00 1.50 17.5000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值