在熊猫中对多层次数据进行子集化

时间:2018-10-25 21:55:27

标签: python pandas pandas-groupby data-science

我已经成功使用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上执行。

1 个答案:

答案 0 :(得分:2)

我认为您要查找的功能是quantile(),您可以将其添加到groupby().apply()语句中。对于第十个百分位数,请使用quantile(.1)

df.groupby(['date','letter'])['value'].apply(lambda g: g[g <= g.quantile(.1)].mean())