Untuk MultiIndex dengan level berulang, bagaimana saya bisa menghitung perbedaan dengan level indeks lain, mengabaikannya secara efektif?

Mari saya jelaskan dalam kode.

>>> ix = pd.MultiIndex.from_product([(0, 1, 2), (0, 1, 2, 3)])
>>> df = pd.DataFrame([5]*4 + [4]*4 + [3, 2, 1, 0], index=ix)
>>> df
     0
0 0  5
  1  5
  2  5
  3  5
1 0  4
  1  4
  2  4
  3  4
2 0  3
  1  2
  2  1
  3  0

Sekarang dengan beberapa operasi saya ingin mengurangi kumpulan nilai terakhir (2, 0:4) dari seluruh bingkai data. Yaitu. df - df.loc[2] untuk menghasilkan ini:

     0
0 0  2
  1  3
  2  4
  3  5
1 0  1
  1  2
  2  3
  3  4
2 0  0
  1  0
  2  0
  3  0

Tetapi pernyataan itu menghasilkan kesalahan. df - df.loc[2:3] tidak, tetapi selain nol tambahan hanya NaN yang dihasilkan - tentu saja karena indeks tidak cocok.

Bagaimana ini bisa dicapai?


Saya menyadari bahwa tingkat indeks justru masalahnya. Jadi saya sedikit lebih dekat.

>>> df.droplevel(0) - df.loc[2]
   0
0  2
0  1
0  0
1  3
1  2
1  0
2  4
2  3
2  0
3  5
3  4
3  0

Masih belum sesuai dengan yang saya inginkan. Tapi saya tidak tahu apakah ada cara yang nyaman untuk mencapai apa yang saya cari.

2
Felix 8 Januari 2020, 21:00

2 jawaban

Jawaban Terbaik

Ini dengan stack dan unstack:

new_df = df.unstack()
new_df.sub(new_df.loc[2]).stack()

Keluaran:

     0
0 0  2
  1  3
  2  4
  3  5
1 0  1
  1  2
  2  3
  3  4
2 0  0
  1  0
  2  0
  3  0
2
Quang Hoang 8 Januari 2020, 18:09

Coba buat kerangka data dengan indeks identik dan petakan kumpulan data terakhir dengan tingkat pertama dan isi di seluruh kerangka data , lalu kurangi:

df - pd.DataFrame(index=df.index,data=df.index.get_level_values(1).map(df.loc[2].squeeze()))

     0
0 0  2
  1  3
  2  4
  3  5
1 0  1
  1  2
  2  3
  3  4
2 0  0
  1  0
  2  0
  3  0
1
anky 8 Januari 2020, 18:07