[英]Python: How to filter a Pandas Dataframe by matching any value in a list to Column that contains lists
[英]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是使用apply
與in
:
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.join
與str.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.