Python Pandas DataFrame:如何计算价格除以组类别行数的新列?

Python Pandas DataFrame:如何计算价格除以组类别行数的新列?,python,pandas,Python,Pandas,我的数据框有名称、组、价格列和数据 价格数据是集团支付的总价格。 我需要为每一行计算平均价格每人的行 例如,对于A组成员,我需要将支付的价格12除以该组中的人数:3 因此,购买力平价(人均价格)应为12/3=4 df = pd.DataFrame( data = [('Bob', 'A', 12), ('Jessica', 'A',12), ('Kevin', 'A',12), ('Mary', 'B',5),

我的数据框有名称、组、价格列和数据

价格数据是集团支付的总价格。 我需要为每一行计算平均价格每人的行

例如,对于A组成员,我需要将支付的价格12除以该组中的人数:3

因此,购买力平价(人均价格)应为12/3=4

df = pd.DataFrame(
    data = [('Bob', 'A', 12),
            ('Jessica', 'A',12),
            ('Kevin', 'A',12),
            ('Mary', 'B',5),
            ('John', 'C',14),
            ('Mel', 'C',14)
            ],
    columns=['Names', 'Group', 'Price']
)
我试过这个:

a=df.groupby('Group')['Price'].max()
b=df.groupby('Group')['Price'].count()
df.groupby('Group')['Price'].max() / df.groupby('Group')['Price'].count()
ppp = a/b

df['ppp']=0

for a in df.itertuples():
    print(a)
    print(a.Group)
    a.ppp = ppp[a.Group]
但我有一个错误: AttributeError:无法设置属性

预期结果是:

df = pd.DataFrame(
    data = [('Bob', 'A', 12, 4),
            ('Jessica', 'A',12, 4),
            ('Kevin', 'A',12, 4),
            ('Mary', 'B',5, 5),
            ('John', 'C',14, 7),
            ('Mel', 'C',14, 7)
            ],
    columns=['Names', 'Group', 'Price', 'ppp']
)
你能告诉我怎么了吗,
还有,如果可能的话,如何在不重复的情况下实现这一点?

尝试使用
transform

a = df.groupby('Group')['Price'].transform('max')
b = df.groupby('Group')['Price'].transform('count')
df['ppp'] = a/b

尝试使用
transform

a = df.groupby('Group')['Price'].transform('max')
b = df.groupby('Group')['Price'].transform('count')
df['ppp'] = a/b

另一种方法是创建映射并重新分配回原始数据帧

请注意,
transform
更为惯用:

mapping = df.groupby("Group").Price.pipe(lambda x: x.max() / x.count())
mapping

Group
A    4.0
B    5.0
C    7.0
Name: Price, dtype: float64


df.assign(ppp=df.Group.map(mapping))

    Names   Group   Price   ppp
0   Bob         A   12  4.0
1   Jessica     A   12  4.0
2   Kevin       A   12  4.0
3   Mary        B   5   5.0
4   John        C   14  7.0
5   Mel         C   14  7.0

另一种方法是创建映射并重新分配回原始数据帧

请注意,
transform
更为惯用:

mapping = df.groupby("Group").Price.pipe(lambda x: x.max() / x.count())
mapping

Group
A    4.0
B    5.0
C    7.0
Name: Price, dtype: float64


df.assign(ppp=df.Group.map(mapping))

    Names   Group   Price   ppp
0   Bob         A   12  4.0
1   Jessica     A   12  4.0
2   Kevin       A   12  4.0
3   Mary        B   5   5.0
4   John        C   14  7.0
5   Mel         C   14  7.0

这是一个丑陋的解决方案,效果很好

df['ppp']=df.apply(lambda row: df.loc[df['Group']==row.Group,'Price'].max()/df.loc[df['Group']==row.Group,'Price'].count(),axis=1)

这是一个丑陋的解决方案,效果很好

df['ppp']=df.apply(lambda row: df.loc[df['Group']==row.Group,'Price'].max()/df.loc[df['Group']==row.Group,'Price'].count(),axis=1)

是的,根据数据集的大小,这通常是一个更快的解决方案,而不是在每个循环中创建变量。也不错。我必须寻找这个管道和映射方法。是的,根据数据集的大小,这通常是一个更快的解决方案,而不是在每个循环中创建变量。也不错。我必须寻找这个管道和地图方法。谢谢。太好了,这看起来很简单。。。。你能告诉我为什么转换有效,而不是.max()和.count()方法吗?@Malo max函数和groupby将使结果聚合。谢谢。太好了,这看起来很简单。。。。你能告诉我为什么转换有效,而不是.max()和.count()方法吗?@Malo max函数和groupby将使结果聚合。