我有一个数据帧df,其中一列是#34;值"。它包含 -
values
[u'12f4',u'ff45',u'tr23']
[u'125g4',u'ff145',u'trr523']
[u'12f34',u'ff2345',u'trg23a']
我有一个单独的列表' list1'包含一些值 -
[u'trg23a',u'ff2345',u'ff45',u'fg567ui',u'45ty78',u'125g4',u'ff145']
我想在df中创建一个名为" values1"的新列。仅包含" list1"中存在的那些值。所以输出应该像 -
values values
[u'12f4',u'ff45',u'tr23'] [u'ff45']
[u'125g4',u'ff145',u'trr523'] [u'125g4',u'ff145']
[u'12f34',u'ff2345',u'trg23a'] [u'ff2345',u'trg23a']
我尝试了以下代码,但它似乎并没有起作用。
df['values1'] = [element for element in
df['values'] if element not in list1]
答案 0 :(得分:0)
使用apply
或嵌套list comprehension
:
print (type(df.loc[0, 'values']))
<class 'str'>
from ast import literal_eval
#convert string values to lists
df['values'] = df['values'].apply(literal_eval)
print (type(df.loc[0, 'values']))
<class 'list'>
df['values1'] = df['values'].apply(lambda x: [element for element in x if element in list1])
print (df)
values values1
0 [12f4, ff45, tr23] [ff45]
1 [125g4, ff145, trr523] [125g4, ff145]
2 [12f34, ff2345, trg23a] [ff2345, trg23a]
或者:
df['values1'] = [[element for element in x if element in list1] for x in df['values']]
print (df)
values values1
0 [12f4, ff45, tr23] [ff45]
1 [125g4, ff145, trr523] [125g4, ff145]
2 [12f34, ff2345, trg23a] [ff2345, trg23a]
答案 1 :(得分:0)
您可以使用map
和filter
,尽管像@ jezrael的解决方案中使用的条件列表理解可能稍微有点效率。
您基本上是在df [&#39; values&#39;]列中的每个项目上运行过滤器lambda表达式。
values = [u'trg23a',u'ff2345',u'ff45',u'fg567ui',u'45ty78',u'125g4',u'ff145']
df = df.assign(
values1=df['values'].map(
lambda row_items: filter(lambda item: item in values, row_items)))
>>> df
values values1
0 [12f4, ff45, tr23] [ff45]
1 [125g4, ff145, trr523] [125g4, ff145]
2 [12f34, ff2345, trg23a] [ff2345, trg23a]