根据列表列表过滤 pandas 数据框
Filtering a pandas dataframe based of list of 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]
我有一个包含一列列表的 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]