簡體   English   中英

如何為包含列表的列過濾數據框

[英]How to filter dataframe for column with lists contains value

我們有一列中包含列表的數據框。 無法找到簡單的方法來為行中包含值的行過濾數據框。

df = pd.DataFrame({'lists':[['a', 'c'], ['a', 'b', 'd'], ['c', 'd']]})

例如,我只需要在其列表中包含“ a”的行。 我設法只通過“應用”獲得它。

df[df.lists.apply(lambda x: True if 'a' in x else False)]
>>>     lists
>>>0    [a, c]
>>>1    [a, b, d]

是否有類似.isin()的內容,反之亦然? 獲取所需行的最佳方法是什么? 謝謝。

Simpliest是使用applyin

df1 = df[df.lists.apply(lambda x: 'a' in x)]

但是如果要檢查a create DataFrame ,則有點復雜:

df1 = df[pd.DataFrame(df.lists.values.tolist()).eq('a').any(axis=1)]

另一種解決方案是將str.joinstr.contains str.join使用:

df1 = df[df.lists.str.join(',').str.contains('a')]

print (df1)
       lists
0     [a, c]
1  [a, b, d]

通過列表理解進行布爾索引是一種方法:

df = pd.DataFrame({'lists':[['a', 'c'], ['a', 'b', 'd'], ['c', 'd']]})

df[['a' in x for x in df['lists'].values]]

#        lists
# 0     [a, c]
# 1  [a, b, d]

一些性能基准測試:

df = pd.DataFrame({'lists':[['a', 'c'], ['a', 'b', 'd'], ['c', 'd']]})

df = pd.concat([df]*100000)

def jez1(df):
    return df[df.lists.apply(lambda x: 'a' in x)]

def jez2(df):
    return df[pd.DataFrame(df.lists.values.tolist()).eq('a').any(axis=1)]

def jez3(df):
    return df[df.lists.str.join(',').str.contains('a')]

def jp(df):
    return df[['a' in x for x in df['lists'].values]]

%timeit jez1(df)  # 87ms
%timeit jez2(df)  # 122ms
%timeit jez3(df)  # 416ms
%timeit jp(df)    # 53ms

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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