Data saya terlihat seperti ini:

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

Untuk setiap mall dan kategori, saya ingin membandingkan perbedaan harga dengan telur.

Dalam hal ini:
Harga susu di Mall A - harga telur di Mall A
Harga telur di Mall A - harga telur di Mall A
Harga daging sapi di Mall B - harga telur di Mall B
Harga telur di Mall B - harga telur di Mall B
Harga jeruk di Mall C - harga telur di Mall C
Harga telur di Mall C - harga telur di Mall C

Hasil yang diharapkan:

    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

Apa yang harus saya lakukan?

1
NovaPoi 23 Desember 2020, 11:43

3 jawaban

Jawaban Terbaik

Untuk membandingkan dengan Egg mengganti nilai non Egg dalam Price dengan nilai yang hilang dengan Series.where lalu gunakan GroupBy.transform dengan GroupBy.first untuk pengulangan egg price, terakhir kurangi Price oleh Series.sub :

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

Jika Egg selalu merupakan nilai kedua per grup dan setiap grup hanya berisi 2 nilai:

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
1
jezrael 23 Desember 2020, 08:49

Gunakan 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
0
Mayank Porwal 23 Desember 2020, 08:45

Gunakan groupby dengan transform:

df['Price_diff'] = df.groupby('Mall')['Price'].transform(lambda x: [x.tolist()[0] - x.tolist()[1], 0])

Keluaran:

  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
0
U11-Forward 23 Desember 2020, 08:49