Python 使用右映射创建列

Python 使用右映射创建列,python,pandas,numpy,jupyter-notebook,Python,Pandas,Numpy,Jupyter Notebook,我有一个数据帧df1,其中一列是“值”。看起来像—— values ['acd3f','rt5gh8','5ty7e'] ['rt5gh8','t67ui'] 我有另一个数据帧df2,它包含两列“0”和“1”,其值如下- 0 1 acd3f I am cool rt5gh8 I am not cool 5ty7e ok_sir t67ui no_sir 我想修改df1以添加一个新列“value\u names”,它应该看起来像- values

我有一个数据帧df1,其中一列是“值”。看起来像——

values
['acd3f','rt5gh8','5ty7e']
['rt5gh8','t67ui']
我有另一个数据帧df2,它包含两列“0”和“1”,其值如下-

0         1
acd3f    I am cool
rt5gh8   I am not cool
5ty7e    ok_sir
t67ui    no_sir
我想修改df1以添加一个新列“value\u names”,它应该看起来像-

values                        value_names
['acd3f','rt5gh8','5ty7e']    ['I am cool','I am not cool','ok_sir']
['rt5gh8','t67ui']            ['I am not cool','no_sir']
我正在尝试以下代码-

df1['value_names'] = df1['values'].replace(df2.set_index('0')['1'].dropna())
它似乎不起作用,给了我一个错误-

KeyError: '1'
注:

基本上,我以前使用的不是df2而是一个带有映射的列表。我将其转换为数据帧df2,df2中的这些列名“0”和“1”被自动分配。

创建一个字典(
映射
),将键从
df2
映射到它们的映射值(列
0
是键,列
1
是它们对应的值)

然后使用嵌套列表查询值,并使用
assign
将其附加到
df1

df1 = pd.DataFrame({'values': [['acd3f','rt5gh8','5ty7e'], ['rt5gh8','t67ui']]})

df2 = pd.DataFrame({0: ['acd3f', 'rt5gh8', '5ty7e', 't67ui'], 
                    1: ["I am cool", "I am not cool", "ok_sir", "no_sir"]})

mapping = {k: v for k, v in zip(df2[0], df2[1])}

>>> df1.assign(value_names=[[mapping.get(val) for val in sublist] 
                            for sublist in df1['values'] ])
                   values                         value_names
0  [acd3f, rt5gh8, 5ty7e]  [I am cool, I am not cool, ok_sir]
1         [rt5gh8, t67ui]             [I am not cool, no_sir]
亚历山大守则的更简单版本(imo):

In [484]: mapping = dict(df2.values[:, :2])

In [485]: df1.assign(value_names=df1['values'].apply(lambda x: [mapping[k] for k in x]))
Out[485]: 
                   values                         value_names
0  [acd3f, rt5gh8, 5ty7e]  [I am cool, I am not cool, ok_sir]
1         [rt5gh8, t67ui]             [I am not cool, no_sir]
您可以从使用
df2.values
检索的2D
np
数组创建映射


然后,使用
df.assign
创建
value\u name
列表。

在我看来,该列不是
'1'
,而是
1
…基本上,我以前使用的是一个带有映射的列表,而不是df2。我将其转换为数据帧df2,并且这些列名是自动分配的。@cᴏʟᴅsᴘᴇᴇᴅ 一个人的简化是另一个人的复杂…我选择了映射方法
{k:v代表k,v在zip中(df2[0],df2[1])
因为它在用于键的列和用于值的列方面更为明确,而且如果dataframe的列多于列出的两列,它也会起作用。我更喜欢嵌套列表理解,但您建议的第二种方法应该同样有效。