【问题标题】:Filtering a pandas dataframe based of list of lists根据列表过滤熊猫数据框
【发布时间】:2021-12-01 20:39:24
【问题描述】:

我有一个带有一列列表的 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']]

我要做的是根据列表值过滤掉熊猫数据框。这是我尝试过的:

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

【问题讨论】:

  • list 是 Python 中的关键字,您将其用作变量名,请尝试给它另一个名称。
  • 我在这个例子中使用列表作为变量。
  • 我更新了变量名

标签: python pandas list dataframe nested-lists


【解决方案1】:

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

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]

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 2020-05-05
    • 2014-12-27
    • 2019-12-09
    • 2019-05-21
    • 2017-12-15
    • 2019-03-04
    • 2020-08-16
    • 2016-08-31
    相关资源
    最近更新 更多