python - 根据列表列表过滤 Pandas 数据框

标签 python pandas list dataframe nested-lists

我有一个带有一列列表的 pandas 数据框,我试图根据另一个列表列表将其过滤掉。

id           path
101     ['Activities (DEV)', 'public', '_yoyo_log']
102     ['Activities (DEV)', 'public', 'behavior_trackers']
103     ['Activities (DEV)', 'public', 'journal_entries']
104     ['Social (PROD)', 'public', 'starva_activity']
105     ['pg-prd (DEV-RR)', 'public', 'activities']
106     ['pg-prd (DEV-RR)', 'public', 'blackouts']

和列表列表

slist = [['activities (dev)', 'public', 'behavior_trackers'],
        ['activities (dev)', 'public', 'journal_entries'],
        ['pg-prd (dev-rr)', 'public', 'activities']]

我想做的是根据列表值过滤掉 pandas 数据框。这是我尝试过的:

df = df[df['path'].apply(lambda x: eval(str(x).lower())).isin(slist)]

这种方法有时有时有效,但大多数时候它会抛出一个错误提示

TypeError: unhashable type: 'list'

我希望我的输出是这样的

id           path
102     ['Activities (DEV)', 'public', 'behavior_trackers']
103     ['Activities (DEV)', 'public', 'journal_entries']
105     ['pg-prd (DEV-RR)', 'public', 'activities']

是否有更好的方法来做到这一点,还是我遗漏了什么?我正在使用 pyenv 3.6.2

最佳答案

在 - 列中使用元组进行过滤,并将列表转换为元组:

t = [tuple(x) for x in slist]
df = df[df['path'].apply(lambda x: tuple(eval(str(x).lower()))).isin(t)]

或者:

df = df[df['path'].apply(lambda x: tuple([y.lower() for y in x])).isin(t)]

print (df)
    id                                           path
1  102  [Activities (DEV), public, behavior_trackers]
2  103    [Activities (DEV), public, journal_entries]
4  105          [pg-prd (DEV-RR), public, activities]

关于python - 根据列表列表过滤 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69554266/

相关文章:

perl - 如何按元素对两个列表求和

python - 将 pandas 数据帧写入 AWS athena 数据库

python - 有没有一种使用正则表达式反转子字符串的简单方法?

python - Pandas 数据框到 Spark 数据框,处理 NaN 转换为实际空值?

python - 按一列分组并计算 Pandas 中的多个类别

list - netlogo 列出 : iterating over two lists

java - 带有 Getter/Setter 的私有(private)列表与公共(public)列表

Python - 在私有(private)模式下使用 Selenium 启动 firefox

python - 过滤 Sqlalchemy 关系条件

python - 如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?