【问题标题】:Create the column with right mapping使用右映射创建列
【发布时间】:2018-01-10 04:49:26
【问题描述】:

我有一个数据框 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...
  • 基本上,我之前拥有的不是 df2 而是一个带有映射的列表。我将其转换为数据框 df2 并自动分配这些列名。

标签: python pandas numpy jupyter-notebook


【解决方案1】:

创建一个字典 (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]

【讨论】:

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

Alexander 代码的更简单版本 (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 检索到的二维np 数组创建映射。

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

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多