首頁 >後端開發 >Python教學 >如何有效地選擇 Pandas MultiIndex DataFrame 中的行?

如何有效地選擇 Pandas MultiIndex DataFrame 中的行?

Susan Sarandon
Susan Sarandon原創
2024-12-12 19:01:16267瀏覽

How to Efficiently Select Rows in Pandas MultiIndex DataFrames?

在Pandas MultiIndex DataFrame 中選擇行

問題摘要

給定一個帶有MultiIndex 的Pandas DataFrame,我們如何根據特定值選擇行/每個索引等級中的標籤?

切片loc

df.loc[key, :]
  • key 是一個標籤元組,每個索引等級一個。
  • 這提供了一種方便而簡潔的方法來根據不同層級中的特定值來選擇行。

切片xs

df.xs(level_key, level=level_name, drop_level=True/False)
  • level_key 是特定索引等級的鍵。
  • drop_level 控制是否應從產生的 DataFrame 中刪除該等級。
  • xs 是在單一層級上切片時特別有用。

過濾query

df.query("condition")
  • condition 是一個布林表達式,指定過濾條件。
  • 支援跨多個索引層級的靈活過濾。

使用 get_level_values

mask = df.index.get_level_values(level_name).isin(values_list)
selected_rows = df[mask]
  • 建立一個布林值基於特定索引等級中的值的遮罩。
  • 對於更複雜的過濾操作或對多個值進行切片時很有用。

範例

範例1:選擇等級「一」中具有特定值的行,且'two':

# Using loc
selected_rows = df.loc[['a'], ['t', 'u']]

# Using xs
selected_rows = df.xs('a', level='one', drop_level=False)
selected_rows = selected_rows.xs(['t', 'u'], level='two')

# Using query
selected_rows = df.query("one == 'a' and two.isin(['t', 'u'])")

# Using get_level_values
one_mask = df.index.get_level_values('one') == 'a'
two_mask = df.index.get_level_values('two').isin(['t', 'u'])
selected_rows = df[one_mask & two_mask]

範例2:依等級'two'中的數值不等式過濾行:

# Using query
selected_rows = df.query("two > 5")

# Using get_level_values
two_mask = df.index.get_level_values('two') > 5
selected_rows = df[two_mask]

提示和注意事項

  • 考慮切片/過濾操作的複雜性並相應地選擇適當的方法。
  • 對於單一或幾個等級的簡單切片,首選 loc 或 xs。
  • 對於多個值的複雜過濾或切片,請考慮使用 query 或 get_level_values 作為它們提供了更大的靈活性。
  • 注意使用 pd.IndexSlice 來指定複雜的切片操作loc.
  • sort_index() 可以提高具有未排序 MultiIndex 的大型 DataFrame 的效能。

以上是如何有效地選擇 Pandas MultiIndex DataFrame 中的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn