我有一个数据框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_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和这些列名" 0"和" 1"在df2中自动分配。
答案 0 :(得分:2)
从mapping
创建一个字典(df2
)到其映射值的字典(列0
是键,列1
是它们对应的值。
然后使用嵌套列表推导来查找值,并使用df1
将其附加到assign
。
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]
答案 1 :(得分:1)
亚历山大代码的简单版本(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]
您可以使用np
检索的2D df2.values
数组创建映射。
然后,使用df.assign
创建value_names
列表。