2017-08-02 93 views
1

我有一个数据框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,并自动分配df2中的这些列名称“0”和“1”。

+1

在我看来,列不是''1'',而是'1' ... –

+0

基本上,我以前的而不是df2是一个带映射的列表。我将其转换为数据框df2,并自动分配这些列名称。 – ComplexData

回答

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] 
+0

@cᴏʟᴅsᴘᴇᴇᴅ一个人的简化是另一个人的复杂性......我选择了映射方法'{k:v for k,v in zip(df2 [0],df2 [1])}'',因为它更加明确用于键的列和用于值的列,因为如果数据帧的列数多于列出的两列,它也可以工作。我更喜欢嵌套的列表理解,但您建议的第二种方法应该同样适用。 – Alexander

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] 

您可以使用df2.values从2D np数组检索创建映射。

然后,使用df.assign创建value_names列表。

相关问题