在pandas中对多层次数据进行子集筛选

4

我成功地使用groupby()函数计算分组数据的统计信息,但现在我想对每个组的子集执行相同的操作。

我似乎无法理解如何为每个组生成一个子集(作为一个groupby对象),然后将其应用于mean()等groupby函数。以下代码行按预期工作:

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百分位数的数据。关键点是子集必须在组内进行,而不是在整个数据框中先进行。


那么对于每个X和每个Y条目,您都有一个要求平均值的列表/数组? - AER
1个回答

2
我认为你需要的函数是quantile(),你可以将其添加到groupby().apply()语句中。要获取第十个百分位数,请使用quantile(.1):
df.groupby(['date','letter'])['value'].apply(lambda g: g[g <= g.quantile(.1)].mean())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接