Python 熊猫:如何映射列表列中的值?

Python 熊猫:如何映射列表列中的值?,python,pandas,Python,Pandas,数据框中的列包含值列表 使用字典,我想使用字典创建一个带有映射值的新列,对于字典中没有的任何值,这些值都将被删除 下面是一个简单的例子: 数据帧的设置 df = pd.DataFrame(data={ 'B': ['x', 'y', 'z']}) df.at[0, 'B'] = ['jki', 'gg4', 'k6k'] df.at[1, 'B'] = ['2f4', 'gg4', 'g24'] df.at[2, 'B'] = ['1k1', 'g24', '1k1', '2f4'] 导致 d

数据框中的列包含值列表

使用字典,我想使用字典创建一个带有映射值的新列,对于字典中没有的任何值,这些值都将被删除

下面是一个简单的例子:

数据帧的设置

df = pd.DataFrame(data={ 'B': ['x', 'y', 'z']})
df.at[0, 'B'] = ['jki', 'gg4', 'k6k']
df.at[1, 'B'] = ['2f4', 'gg4', 'g24']
df.at[2, 'B'] = ['1k1', 'g24', '1k1', '2f4']
导致

df

      B
0   [jki, gg4, k6k]
1   [2f4, gg4, g24]
2   [1k1, g24, 1k1, 2f4]
词典的建立

conv = { 'jki': 1, 'gg4': 2, '2f4': 3 , 'g24':4, }
如果列不是列表,则将使用此代码

df['MappedA'] = df.B.map(conv)
但由于该列包含列表,因此无法使用该代码

这是我想要的结果

                      B                  MappedA
0   [jki, gg4, k6k]                [ 1 ,  2 ]
1   [2f4, gg4, g24]              [3, 2, 4]
2   [1k1, g24, 1k1, 2f4]        [ 4 , 3  ]

您可以尝试使用
apply
lambda

df['MappedA'] = df.B.apply(lambda row: [conv[v] for v in row if conv.get(v)])
输出:

                      B    MappedA
0       [jki, gg4, k6k]     [1, 2]
1       [2f4, gg4, g24]  [3, 2, 4]
2  [1k1, g24, 1k1, 2f4]     [4, 3]

使用嵌套列表理解和字典查找:

df.assign(mapped=[[conv[k] for k in row if conv.get(k)] for row in df.B])


您可以使用lambda函数,并为每行列表应用map函数来获取字典值

df.B.apply(lambda x:list(filter(None,map(conv.get,x))))
输出:


df.assign(映射=[[*filter(None,map(conv.get,x))]中为df.B中的x提升一些元素)
如果我想保留列表中的所有值并仅在映射存在时替换,该怎么办?如果我想保留列表中的所有值并仅在映射存在时替换,该怎么办?如果我想保留列表中的所有值并仅在映射存在时替换,该怎么办?
df.B.apply(lambda x:list(filter(None,map(conv.get,x))))
0       [1, 2]
1    [3, 2, 4]
2       [4, 3]
Name: B, dtype: object