如何过滤具有列表的列的数据框包含值[重复]

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】:

最简单的方法是使用applyin

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.joinstr.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 中绘制不同的组时如何将数据作为一组包含在内

具有列表值的列,如果列表具有超过 1 个元素,则解码这两个值并包含在新列的同一行中的列表中

Pandas - 具有重复值的列的外部连接

熊猫数据框:在固定其他列的列中提取具有特定标准/条件最小值的数据[重复]