我已经成功使用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
这里是计算多级组平均值的示例。现在,我想找到每个组的子集的平均值。例如,每个组数据的平均值小于组的百分之十。关键在于,必须在组上执行子集,而不是首先在整个df上执行。
答案 0 :(得分:2)
我认为您要查找的功能是quantile()
,您可以将其添加到groupby().apply()
语句中。对于第十个百分位数,请使用quantile(.1)
:
df.groupby(['date','letter'])['value'].apply(lambda g: g[g <= g.quantile(.1)].mean())