簡體   English   中英

僅當列列表包含其他列表中的值時才過濾行

[英]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.isinall

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]

issubsetset 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]

使用np.setdiff1d

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM