首页 > 解决方案 > 使用相似维度转换行值

问题描述

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

Account Date    Region  Type    Measure Value
Bob     31-Jan  East    A       Sales   7
Bob     31-Jan  West    A       Sales   8
Bob     31-Jan  East    B       Expense 5
Bob     31-Jan  West    B       Expense 10

唯一的区别是我的实际数据框有几个不同的字段用于“帐户”、“日期”和“类型”维度。

我的目标是将 Bob 帐户的值更改为区域之间的 50/50 分配

例如它看起来像:

 Account    Date    Region  Type    Measure Value
 Bob        31-Jan  East    A       Sales   7.5
 Bob        31-Jan  West    A       Sales   7.5
 Bob        31-Jan  East    B       Expense 5
 Bob        31-Jan  West    B       Expense 10

我已经尝试在 Bob 上过滤我的 df 并开始销售:

 df = df[df['Account'] == 'Bob']
 df = df[df['Measure'] == 'Sales']

接下来,我使所有区域都相同:

 df['Region'] = 'East and West'

到这里后,我尝试了几个 groupby 函数,但我无法让它们中的任何一个返回正确的值。

我应该尝试转置我的 df 并从那里开始工作吗?

标签: pythonpython-3.xpandas

解决方案


如果您只需要为'sales'单个人的值执行此操作,则使用布尔索引和mean

mask = (df.Measure == 'Sales') & (df.Account == 'Bob')
df.loc[mask, 'Value'] = df.loc[mask, 'Value'].mean()

但是,如果您想对每个'sales'帐户的度量执行此操作,则应使用+ 。groupbytransform

mask = (df.Measure == 'Sales')
df.loc[mask, 'Value'] = df[mask].groupby('Account').Value.transform('mean')

输出:

  Account    Date Region Type  Measure  Value
0     Bob  31-Jan   East    A    Sales    7.5
1     Bob  31-Jan   West    A    Sales    7.5
2     Bob  31-Jan   East    B  Expense    5.0
3     Bob  31-Jan   West    B  Expense   10.0

在最后一种情况下,您可以在分组列中添加更多列,例如,如果您想计算每个帐户在每个日期、每种类型的平均销售额。


推荐阅读