如果pandas列中列表中的项是字典键,则替换为值,如果不在字典中,则删除

时间:2019-08-25 18:29:28

标签: python pandas

如果熊猫列包含列表,则可以使用字典使用

转换所有值
df['listColumn'] = df['listColumn'].apply(lambda x: [columnDictionary[i] for i in x])

但是,在某些情况下,并非列表中的所有项目都是字典的键。在这种情况下,如何将这些项目替换为空。

例如

columnDictionary = {a:1, b:2, d:7, f:8 }

特定的熊猫行/列:[a,b,c,d,e]

转换后的特定熊猫行/列:[1,2,7]

3 个答案:

答案 0 :(得分:2)

只需简单的条件即可检查列表值是否在目标dict键列表中:

In [47]: df = pd.DataFrame({'listColumn': ['a', 123, list('abcde')]})                                           

In [48]: repl_dict = {'a':1, 'b':2, 'd':7, 'f':8 }                                                              

In [49]: df['listColumn'].apply(lambda x: [repl_dict[v] for v in x if v in repl_dict] if isinstance(x, list) else x)                                                                                                   
Out[49]: 
0            a
1          123
2    [1, 2, 7]
Name: listColumn, dtype: object

答案 1 :(得分:1)

有一个内置函数来检查列表中是否有东西,它称为 isinstance(mydata,list)。whinch会分别返回True或False。

答案 2 :(得分:1)

在lamdba函数内部使用“ if else”:

方法1:将lambda应用于列,仅在下面的一列上(axis = 0)

# apply lambda on 1 column (axis = 0) 
d = {'col1':[ 'a', 'b', 'c', 'd', 'e']}
df = pd.DataFrame(data=d)

columnDictionary ={'a':1, 'b':2, 'd':7, 'f':8 } 

df['col1'] = df['col1'].apply(lambda x: [columnDictionary[x] if x in columnDictionary else ''])
df

方法2:将lambda应用于行(轴= 1),逐行(我认为它比较慢)

d = {'col1':[ 'a', 'b', 'c', 'd', 'e']}
df = pd.DataFrame(data=d)

columnDictionary ={'a':1, 'b':2, 'd':7, 'f':8 } 

df['listColumn'] = df.apply(lambda x: [columnDictionary[i] if i in columnDictionary else '' for i in x],axis=1)
df

结果:

    col1    listColumn
0   a   [1]
1   b   [2]
2   c   []
3   d   [7]
4   e   []