簡體   English   中英

將分組數據與DataFrame中的某一行進行比較

[英]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.transformGroupBy.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

groupbytransform一起使用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM