如何过滤具有列表的列的数据框包含值[重复]
Posted
技术标签:
【中文标题】如何过滤具有列表的列的数据框包含值[重复]【英文标题】:How to filter dataframe for column with lists contains value [duplicate] 【发布时间】:2018-08-07 02:09:59 【问题描述】:我们有一列包含列表的数据框。找不到简单的方法来过滤列表中包含值的行的数据框。
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() 的东西,反之亦然? 获得所需行的最佳方法是什么? 谢谢。
【问题讨论】:
【参考方案1】:最简单的方法是使用apply
和in
:
df1 = df[df.lists.apply(lambda x: 'a' in x)]
但是如果要检查a
创建DataFrame
,但是有点复杂:
df1 = df[pd.DataFrame(df.lists.values.tolist()).eq('a').any(axis=1)]
另一种解决方案是使用str.join
和str.contains
:
df1 = df[df.lists.str.join(',').str.contains('a')]
print (df1)
lists
0 [a, c]
1 [a, b, d]
【讨论】:
【参考方案2】:通过列表推导进行布尔索引是一种方法:
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
【讨论】:
干得好。谢谢!以上是关于如何过滤具有列表的列的数据框包含值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 seaborn 中绘制不同的组时如何将数据作为一组包含在内