[英]Filter rows from dataframe with matching pairs of strings [str.contains() AND Operation - Python, Pandas ]
我需要從包含匹配字符串對的 dataframe 中過濾行。 例如,如果以下實例在僅過濾 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 運算符來滿足此需求,但返回的是一個空的 dataframe:
df = df[(df["Period"].str.contains("0 Month")) & (df["Period"].str.contains("3 Month"))]
df
您可以nunique
groupby
來計算唯一“周期”的數量並過濾具有超過 1 個唯一“周期”值的行:
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]
Output:
ID Period
0 1 0 Month
1 2 0 Month
3 1 3 Month
4 2 3 Month
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.