我有一個帶有 2 個級別A和B. 我想通過查詢 levelA和之間的值來選擇一行B。只有一行與每個值匹配。使用切片選擇單行作業正常。
import pandas as pd
df = pd.DataFrame({
'A': [0, 3, 6, 9],
'B': [2, 5, 8, 11],
'C': [0, 1, 2, 3],
})
df = df.set_index(['A', 'B'], drop=True)
print(df)
# C
# A B
# 0 2 0
# 3 5 1
# 6 8 2
# 9 11 3
# Get row where 1 in between A and B
print(df.loc[(slice(None, 1), slice(1, None)), :])
# C
# A B
# 0 2 0
但是,我需要選擇多行。一個一個地做這件事很慢。有沒有辦法選擇多行?
注意:我不必使用 DataFrame。如果有一些更適合這項作業的資料結構,我很樂意使用它。
uj5u.com熱心網友回復:
您可以使用.between和傳遞列'A','B'而不必在以后將它們設定為級別。在下面的示例中,有兩行'C'位于“A”和“B”之間:
df = pd.DataFrame({
'A': [0, 3, 6, 9],
'B': [2, 5, 8, 11],
'C': [0, 1, 2, 10],
})
df_selected = df[df['C'].between(df['A'],df['B'])].set_index(['A', 'B'], drop=True)
結果:
C
A B
0 2 0
9 11 10
uj5u.com熱心網友回復:
你可以試試這個:
df2 = df.reset_index()
df2.query("A <= C <= B").set_index(['A', 'B'], drop=True)
uj5u.com熱心網友回復:
為了得到一個更有啟發性的例子,讓我們將源 DataFrame 再擴展一行,其中C的值介于A和B之間:
C
A B
0 2 0
3 5 1
6 8 2
9 11 3
11 13 12
要獲取C位于A和B之間的行,您可以:
從將df的索引保存在單獨的變數中開始:
ind = df.index然后,為了得到你想要的,運行:
result = df[np.logical_and(ind.get_level_values(0) <= df.C, ind.get_level_values(1) >= df.C)]
結果是:
C
A B
0 2 0
11 13 12
因此,如您所見,無需重置索引。
或者沒有np.logical_and:
result = df[(ind.get_level_values(0) <= df.C) & (ind.get_level_values(1) >= df.C)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/392629.html
上一篇:混淆矩陣ix沒有給出正確的結果
