熊猫:取具有匹配值的行的平均值

时间:2018-07-07 12:15:27

标签: python-3.x pandas

我已经尝试过在论坛上发布的一些想法,但是都没有用。我有一个产品标识符和价格的数据框。我已经将df范围缩小到仅在较大数据库中同一产品的价格超过一个的情况。现在,我想创建一个新列,将其作为给定产品的平均价格。即:

ID          Price
ABC1        101.45
XYZ2        88.12
ABC1        99.24
XYZ2        82.99
ABC1        105.00

我想要的输出是这样的:

ID          Price          AvgPx
ABC1        101.45         101.897
XYZ2        88.12          85.556
ABC1        99.24          101.897
XYZ2        82.99          85.556
ABC1        105.00         101.897

我已经尝试过各种版本的groupby和for循环,但没有任何效果。感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

虽然提供的其他解决方案效果很好,但我认为在此处使用transform会产生清晰易读的代码:

df['AvgPx'] = df.groupby('ID')['Price'].transform('mean')

>>> df
     ID   Price       AvgPx
0  ABC1  101.45  101.896667
1  XYZ2   88.12   85.555000
2  ABC1   99.24  101.896667
3  XYZ2   82.99   85.555000
4  ABC1  105.00  101.896667

答案 1 :(得分:2)

您可以创建数据框的汇总版本,然后使用merge将原始数据框与汇总合并。

agg_df = df.groupby('ID', as_index=False)['Price'].mean().rename(columns={'Price': 'AvgPx'})


df = df.merge(agg_df)

ID   Price       AvgPx
0  ABC1  101.45  101.896667
1  ABC1   99.24  101.896667
2  ABC1  105.00  101.896667
3  XYZ2   88.12   85.555000
4  XYZ2   82.99   85.555000

答案 2 :(得分:2)

您可以这样做:

avg = df.groupby('ID').Price.mean()
df.join(avg, on='ID', rsuffix='Avg')

最好说df['AvgPx'] = avg.reindex(df.ID),但这是行不通的,因为reindex()需要一个唯一的序列。