这是简化的上下文。我有多种类型的商品(Goods_ID 0001、0002 和 0003),其中多个商店(A、B、C)的价格不同。
我需要添加两个额外的列“MinPriceShop”和“MinPrice”,用于输出提供最低价格的商店及其各自的价格。
输入df:
Goods_ID ShopID Price
0001 A 10
0001 B 12
0002 A 23
0002 B 22
0003 A 5
0003 B 6
0003 C 4.5
所需输出 df:
Goods_ID ShopID Price MinPriceShop MinPrice
0001 A 10 A 10
0001 B 12 A 10
0002 A 23 B 22
0002 B 22 B 22
0003 A 5 C 4.5
0003 B 6 C 4.5
0003 C 4.5 C 4.5
我不确定如何将聚合函数(最小值、最大值、总和)应用于数据帧,但具有“行特定”/“动态”条件。
谢谢!
最佳答案
使用groupby
与 idxmin
对于每组包含行数最小 Price
的数据框,重命名列和 merge
到原始的左连接。
替代解决方案使用sort_values
+ drop_duplicates
:
d = {'ShopID':' MinPriceShop','Price':'MinPrice'}
df1 = df.loc[df.groupby('Goods_ID')['Price'].idxmin()].rename(columns=d)
#alternative solution:
#df1 = df.sort_values(['Goods_ID','Price']).drop_duplicates('Goods_ID').rename(columns=d)
df = pd.merge(df, df1, on='Goods_ID', how='left')
print (df)
Goods_ID ShopID Price MinPriceShop MinPrice
0 1 A 10.0 A 10.0
1 1 B 12.0 A 10.0
2 2 A 23.0 B 22.0
3 2 B 22.0 B 22.0
4 3 A 5.0 C 4.5
5 3 B 6.0 C 4.5
6 3 C 4.5 C 4.5
详细信息:
print (df1)
Goods_ID MinPriceShop MinPrice
0 1 A 10.0
3 2 B 22.0
6 3 C 4.5
关于 python Pandas |创建新列 - 基于行特定条件的聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48397963/