[英]Comparing grouped data with a certain row in DataFrame
我的數據如下所示:
df = pd.DataFrame(
{
"Mall": ["A", "A", "B", "B", "C", "C"],
"Category": ["Milk", "Egg", "Beef", "Egg", "Orange", "Egg"],
"Price": [5, 10, 15, 9, 7, 11]
},
columns=["Mall", "Category", "Price"],
)
df
>>>
Mall Category Price
0 A Milk 5
1 A Egg 10
2 B Beef 15
3 B Egg 9
4 C Orange 7
5 C Egg 11
對於每個商場和類別,我想比較一下雞蛋的價格差異。
在這種情況下:
商場 A 的牛奶價格 - 商場 A 的雞蛋價格
商場A的雞蛋價格 - 商場A的雞蛋價格
商場 B 的牛肉價格 - 商場 B 的雞蛋價格
商場 B 的雞蛋價格 - 商場 B 的雞蛋價格
商城橙價C-商城雞蛋價C
商城雞蛋價格 C - 商城雞蛋價格 C
預期結果:
Mall Category Price Price_diff
0 A Milk 5 -5
1 A Egg 10 0
2 B Beef 15 6
3 B Egg 9 0
4 C Orange 7 -4
5 C Egg 11 0
我應該怎么辦?
為了將Price
中的Egg
替換非Egg
值與 Series.where 的缺失值進行Series.where
,然后將GroupBy.transform
與GroupBy.first
用於重復egg price
,最后通過Series.sub
減去Price
:
df['Price_diff'] = (df['Price'].sub(df['Price'].where(df['Category'].eq('Egg'))
.groupby(df['Mall']).transform('first')))
print (df)
Mall Category Price Price_diff
0 A Milk 5 -5.0
1 A Egg 10 0.0
2 B Beef 15 6.0
3 B Egg 9 0.0
4 C Orange 7 -4.0
5 C Egg 11 0.0
如果Egg
始終是每組的第二個值,並且每個組僅包含 2 個值:
df['Price_diff'] = df.groupby('Mall')['Price'].diff(-1).fillna(0)
print (df)
Mall Category Price Price_diff
0 A Milk 5 -5.0
1 A Egg 10 0.0
2 B Beef 15 6.0
3 B Egg 9 0.0
4 C Orange 7 -4.0
5 C Egg 11 0.0
使用Groupby.shift
:
In [2167]: df['Price_diff'] = (df.Price - df.groupby('Mall').Price.shift(-1)).fillna(0)
In [2168]: df
Out[2168]:
Mall Category Price Price_diff
0 A Milk 5 -5.0
1 A Egg 10 0.0
2 B Beef 15 6.0
3 B Egg 9 0.0
4 C Orange 7 -4.0
5 C Egg 11 0.0
將groupby
與transform
一起使用:
df['Price_diff'] = df.groupby('Mall')['Price'].transform(lambda x: [x.tolist()[0] - x.tolist()[1], 0])
Output:
Mall Category Price Price_diff
0 A Milk 5 -5
1 A Egg 10 0
2 B Beef 15 6
3 B Egg 9 0
4 C Orange 7 -4
5 C Egg 11 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.