对 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 进行子集化

Python 中 Pandas 的快速子集化

根据另一个数据框/列表对数据框中的列进行子集化

R:根据一天中的时间有效地对数据框进行子集化

用 .duplicated() 迭代地对熊猫块进行子集化给了我空数组

如何在条件满足之前用 N 行中的一些对条件行进行子集化,比我的代码更快?