繁体   English   中英

Python Pandas Groupby 多级

[英]Python Pandas Groupby Multiple Level

我有一个如下所示的数据框:

类别 销售量
2021-01-01 一个 1
2021-01-01 5
2021-01-02 一个 2
2021-01-02 3
2021-01-03 一个 4
2021-01-03 1
2021-01-04 一个 3
2021-01-04 5

我想得到这样的东西

类别 销售量 sales_ix
2021-01-01 一个 1 0.40
2021-01-01 5 1.43
2021-01-02 一个 2 0.80
2021-01-02 3 0.86
2021-01-03 一个 4 1.60
2021-01-03 1 0.29
2021-01-04 一个 3 1.20
2021-01-04 5 1.43

最后一列是每日销售额除以按类别划分的平均每日销售额(A = 2.5 & b = 3.5 的平均销售额)。

我努力了

df['sales_ix'] = df['sales'].apply(lambda x: x/df.groupby('category').mean()['sales'])

,但它没有用。

有人知道如何将最后一列添加到 df 吗?

尝试这个:

df['sales_ix'] = df.groupby('category')['sales'].transform(lambda x: x.div(x.mean()))

示例 dataframe:

df = pd.DataFrame({
  'day': list('12341234'),
  'category': list('aaaabbbb'),
  'sales':[1,2,3,4,5,6,7,8]
})

为了使聚合结果与 dataframe 兼容,需要设置正确的索引:

df = df.set_index(['category'])

现在我们可以将类别平均值添加到 dataframe 中:

df['category_mean'] = df.groupby(['category'])['sales'].mean()

最后,我们计算目标列:

df['sales_ix'] = df['sales'] / df['category_mean']

或者,从索引中恢复category列:

df.reset_index()

您可以使用groupby - transform

result = (
    df.assign(
        sales_ix=df.groupby('category')['sales']
        .transform(lambda x: x / x.mean())
    )
)

如果只有两个类别,您可以使用 np.where

您可以事先获得类别的手段,但您也可以像这样在单行中做到这一点

df['sales_ix'] = np.where(
    df['category'] == 'A',
    df['sales'] / df[df['category'] == 'A']['sales'].mean(),
    df['sales'] / df[df['category'] == 'B']['sales'].mean()
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM