创建具有右映射的列

2024-06-25 22:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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”被自动分配


Tags: 数据nonamesvaluenotokamdf1
2条回答

亚历山大守则的一个简单版本(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_names列表

创建一个字典(mapping),将键映射到它们的值,从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]

相关问题 更多 >