Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 熊猫:取具有匹配值的行的平均值_Python 3.x_Pandas - Fatal编程技术网

Python 3.x 熊猫:取具有匹配值的行的平均值

Python 3.x 熊猫:取具有匹配值的行的平均值,python-3.x,pandas,Python 3.x,Pandas,我尝试过论坛上发布的几个想法,但没有一个是有效的。我有一个产品标识符和价格的数据框架。我已经缩小了df范围,仅限于同一产品在更大的数据库中有多个价格的情况。现在我想创建一个新的列,它将是给定产品的平均价格。即: ID Price ABC1 101.45 XYZ2 88.12 ABC1 99.24 XYZ2 82.99 ABC1 105.00 我想要的输出如下所示: ID Price

我尝试过论坛上发布的几个想法,但没有一个是有效的。我有一个产品标识符和价格的数据框架。我已经缩小了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循环,但都不太管用。谢谢你的帮助

您可以创建数据帧的聚合版本,然后使用“合并”将原始数据帧与聚合连接起来

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

您可以创建数据帧的聚合版本,然后使用“合并”将原始数据帧与聚合连接起来

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
您可以这样做:

avg = df.groupby('ID').Price.mean()
df.join(avg, on='ID', rsuffix='Avg')
最好说
df['AvgPx']=avg.reindex(df.ID)
,但这不起作用,因为
reindex()
需要一个唯一的序列。

您可以这样做:

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

最好说
df['AvgPx']=avg.reindex(df.ID)
,但这不起作用,因为
reindex()
需要一个独特的系列。

虽然提供的其他解决方案效果很好,但我认为在这里使用
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

虽然提供的其他解决方案效果很好,但我认为在这里使用
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

您的数据帧是由“ID”索引的?不抱歉,我有一个索引,只是没有将其放入示例数据集中。您的数据帧是由“ID”索引的?不抱歉,我有一个索引,只是没有将其放入示例数据集中。