我正在嘗試按列分組并切片以在滿足某些條件后查找所有行。我一直在嘗試使它與 idxmax 一起作業,如本例所示,并且可以獲得我需要的簡單條件,但不能滿足多個條件。
df = pd.DataFrame({
'ID':[1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4],
'A':[1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4],
'B':[1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4]
})
ID A B
0 1 1 1
1 1 2 1
2 1 3 1
3 1 4 1
4 2 1 2
5 2 2 2
6 2 3 2
7 2 4 2
8 3 1 3
9 3 2 3
10 3 3 3
11 3 4 3
12 4 1 4
13 4 2 4
14 4 3 4
15 4 4 4
使用此示例資料框,我想按“ID”分組,然后切片以查找“A”==“B”和“A”>=2 之后的所有行。所以這將是所需的輸出:
ID A B
0 2 2 2
1 2 3 2
2 2 4 2
3 3 3 3
4 3 4 3
5 4 4 4
我嘗試了以下代碼,希望它能夠作業,但得到“不可散列的型別:'sl??ice'”錯誤。
df.groupby('ID')[((df['A'] == df['B']) & (df['A'] >= 2)).idxmax():]
我一直在嘗試使用 .loc 或 .values 嘗試幾種不同的方法,但不斷出現錯誤。是否有一種簡單的方法可以在我缺少的一行中執行此操作,或者我需要設定一個小功能來完成此操作?
uj5u.com熱心網友回復:
我們可以在布爾條件上使用groupby 以便在滿足條件后選擇所有行cummax
m = df['A'].eq(df['B']) & df['A'].ge(2)
df[m.groupby(df['ID']).cummax()]
結果
ID A B
5 2 2 2
6 2 3 2
7 2 4 2
10 3 3 3
11 3 4 3
15 4 4 4
uj5u.com熱心網友回復:
首先,提出你的條件。A == B && A >= 2. 然后,將其分組ID,并使用cummax將其擴展到每組的所有后續行:
filtered = df[(df['A'].eq(df['B']) & df['A'].ge(2)).groupby(df['ID']).cummax()]
輸出:
>>> filtered
ID A B
5 2 2 2
6 2 3 2
7 2 4 2
10 3 3 3
11 3 4 3
15 4 4 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/448851.html
