使用匹配的字符串对从 DataFrame 中过滤行

Filter rows from a DataFrame with matching pairs of strings

我需要从包含匹配字符串对的数据框中过滤行。例如,如果以下实例在过滤后仅将 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

您可以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