列表和数据框操作

时间:2017-06-21 22:38:49

标签: python pandas dataframe

我有一个数据帧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]

2 个答案:

答案 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)

您可以使用mapfilter,尽管像@ 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]