对 pandas 中的多层次数据进行子集化
Posted
技术标签:
【中文标题】对 pandas 中的多层次数据进行子集化【英文标题】:Subsetting multi-hierarchical data in pandas 【发布时间】:2019-03-30 14:52:23 【问题描述】:我成功地使用 groupby() 函数来计算分组数据的统计信息,但是,我现在想对每个组的子集执行相同的操作。
我似乎无法理解如何为每个组(作为 groupby 对象)生成一个子集,然后可以将其应用于 groupby 函数,例如 mean()。以下行按预期工作:
d.groupby(['X','Y'])['Value'].mean()
如何对各个组的值进行子集化,然后提供给均值函数?我怀疑 transform() 或 filter() 可能有用,但我不知道怎么用。
编辑以添加可重现的示例:
random.seed(881)
value = np.random.randn(15)
letter = np.random.choice(['a','b','c'],15)
date = np.repeat(pd.date_range(start = '1/1/2001', periods=3), 5)
data = 'date':date,'letter':letter,'value':value
df = pd.DataFrame(data)
df.groupby(['date','letter'])['value'].mean()
date letter
2001-01-01 a -0.039407
b -0.350787
c 1.221200
2001-01-02 a -0.688744
b 0.346961
c -0.702222
2001-01-03 a 1.320947
b -0.915636
c -0.419655
Name: value, dtype: float64
这是一个计算多级组均值的示例。现在我想找到每个组的子集的平均值。例如,每组数据的平均值小于第 10 个百分位数。关键是必须先对组而不是整个 df 执行子集。
【问题讨论】:
所以对于每个 X 和每个 Y 条目,您都有一个您想要的列表/数组的平均值? 【参考方案1】:我认为您正在寻找的函数是quantile()
,您可以将其添加到groupby().apply()
语句中。对于第十个百分位数,使用quantile(.1)
:
df.groupby(['date','letter'])['value'].apply(lambda g: g[g <= g.quantile(.1)].mean())
【讨论】:
以上是关于对 pandas 中的多层次数据进行子集化的主要内容,如果未能解决你的问题,请参考以下文章
Python/Pandas:通过匹配的索引标准对 Dataframe 进行子集化