我需要從包含匹配字串對的資料框中過濾行。例如,如果以下實體在僅過濾 ID 1 和 2 的資料時將保留為 3,則“0 月”條目沒有對應的“3 月”:
df = pd.DataFrame({'ID':[1,2,3,1,2,1], 'Period':['0 Month','0 Month','0 Month','3 Month','3 Month','6 Month']})
OR 操作可以很容易地用于過濾 2 個字串,如下所示,但是如果沒有必要的對,它不會洗掉 ID。
df = df[(df["Period"].str.contains("0 Month")) | (df["Period"].str.contains("3 Month"))]
df
因此,我嘗試使用 AND 運算子來滿足這一需求,但這會回傳一個空資料框:
df = df[(df["Period"].str.contains("0 Month")) & (df["Period"].str.contains("3 Month"))]
df
uj5u.com熱心網友回復:
您可以groupby“ID”以及條件和轉換nunique方法來計算唯一“Period”的數量并過濾具有超過 1 個唯一“Period”值的行:
out = df[df.groupby(['ID', (df["Period"].str.contains("0 Month") | df["Period"].str.contains("3 Month"))])['Period'].transform('nunique') > 1]
請注意,|您可以使用isin:
out = df[df.groupby(['ID', df["Period"].isin(['0 Month', '3 Month'])])['Period'].transform('nunique') > 1]
或組合字串以匹配內部str.contains:
out = df[df.groupby(['ID', df["Period"].str.contains('0|3')])['Period'].transform('nunique') > 1]
輸出:
ID Period
0 1 0 Month
1 2 0 Month
3 1 3 Month
4 2 3 Month
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/422931.html
標籤:
