![](/img/trans.png)
[英]How do I filter only those rows which contains any of the values from a given list of tags
[英]Filter rows only if columns list contains values from another list
我有一個數據框,其中一列是列表:
import pandas as pd
data = [{'colA': 'ID1', 'colB': ['A', 'B', 'C']},
{'colA': 'ID2', 'colB': ['A']},
{'colA': 'ID3', 'colB': ['B']},
{'colA': 'ID4', 'colB': ['A', 'B']},
{'colA': 'ID5', 'colB': ['C', 'D']}]
df = pd.DataFrame(data)
df
colA colB
0 ID1 [A, B, C]
1 ID2 [A]
2 ID3 [B]
3 ID4 [A, B]
4 ID5 [C, D]
我想過濾行,以便僅選擇那些僅包含另一個列表中的值的行。 但是,不應選擇包含任何其他列表中不存在的值的任何行。
valid_list = ['A', 'B']
預期結果
colA colB
0 ID1 [A, B, C] #not selected because it contains C
1 ID2 [A] #Valid
2 ID3 [B] #Valid
3 ID4 [A, B] #Valid
4 ID5 [C, D] #Not valid - Either values not present in valid list
最終數據框:
colA colB
0 ID2 [A]
1 ID3 [B]
2 ID4 [A, B]
使用np.isin
和all
df[df.colB.map(lambda x: np.isin(x, valid_list).all())]
Out[217]:
colA colB
1 ID2 [A]
2 ID3 [B]
3 ID4 [A, B]
將issubset
與set
s一起使用:
df = df[df.colB.map(lambda x: set(x).issubset(valid_list))]
df = df[df.colB.map(lambda x: set(x) <= set(valid_list))]
print (df)
colA colB
1 ID2 [A]
2 ID3 [B]
3 ID4 [A, B]
df[df.colB.apply(lambda x: False if len(np.setdiff1d(x,valid_list)) >= 1 else True)]
要么
df[~df.colB.apply(lambda x: len(np.setdiff1d(x,valid_list)) >= 1)]
colA colB
1 ID2 [A]
2 ID3 [B]
3 ID4 [A, B]
您還可以應用一個函數來獲取掩碼:
df = df[df.colB.apply(lambda lst: all(x in valid_list for x in lst))]
print(df)
colA colB
1 ID2 [A]
2 ID3 [B]
3 ID4 [A, B]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.