【问题标题】:Create a new column based on other columns and a dictionary基于其他列和字典创建新列
【发布时间】:2017-08-03 15:52:01
【问题描述】:

假设我有一个至少包含两列 col1 和 col2 的数据框。我还有一本字典,其键由 col1 中的值组成。 col2.

import pandas as pd
dict_of_dicts = {'x0': {'y0':1, 'y1':2, 'y2':3}, 'x1': {'y0':0, 'y1':0,    'y2':1}, 'x2': {'y0':2, 'y1':1, 'y2':3}} 
df = pd.DataFrame( {'col1': ['x1', 'x2', 'x2'], 'col2': ['y0', 'y1', 'y0']} )
print(df)
  col1 col2
0   x1   y0
1   x2   y1
2   x2   y0

现在我想创建第三列,其中包含我的字典的值,其中的键由相应行中的 col1 和 col2 给出。类似的东西

df['col3'] = dict_of_dicts[df['col1']][df['col2']].

结果应该是这样的:

  col1 col2  col3
0   x1   y0     0
1   x2   y1     1
2   x2   y0     2

它应该类似于“地图”,如Adding a new pandas column with mapped value from a dictionary此处解释的那样

但我依赖于两列。请问有人可以帮我吗?

顺便说一句:我实际上不必使用字典字典(如前所述)。我还可以使用一个表(数据框),其中一组键作为数据框的索引集,另一组键作为列名。但在这里我也不知道如何访问由 col1 和 col2 中的值指定的特定“单元格”。

我希望我的问题很清楚。

谢谢你,娜佳

【问题讨论】:

  • 您的预期输出与您正在寻找的检查建议不匹配。 0 正确吗?
  • 你是对的,我刚刚纠正了一个错误。谢谢。
  • 大家好,我有一个后续问题:假设我没有字典,而是数据框。而不是拥有dicts dict的键,而是拥有数据框的索引和列名。那它会如何运作?非常感谢!
  • 如果您有一个不同的后续问题,请使用您的新输入、所需输出、您尝试了什么以及为什么它不起作用打开一个新问题。 StackOverflow 以问答格式工作,而不是线程。

标签: python pandas dictionary dataframe


【解决方案1】:

你确定你想要的输出是正确的吗? x1 - y0 是表中的 0。如果是这样,这将起作用并仅使用 pandas 的内部函数,希望它们得到很好的优化:

df2 = pd.DataFrame(dict_of_dicts)
df2 = df2.unstack().reset_index()
df.merge(df2, left_on=['col1', 'col2'], right_on=['level_0', 'level_1'], how='left')

这将导致:

  col1 col2 level_0 level_1  0
0   x1   y0      x1      y0  0
1   x2   y1      x2      y1  1
2   x2   y0      x2      y0  2

【讨论】:

    【解决方案2】:

    应该可以通过以下方式使用列表推导:

    df['col3'] = [dict_of_dicts[x][y] for x, y in zip(df['col1'], df['col2'])]
    print(df)
    
      col1 col2  col3
    0   x1   y0     0
    1   x2   y1     1
    2   x2   y0     2
    

    【讨论】:

      【解决方案3】:

      我认为带有匿名功能的简单 pandas.DataFrame.apply 应该可以正常工作:

      df.apply(lambda x: dict_of_dicts[x.col1][x.col2], axis=1)
      

      【讨论】:

      • 很好,快速的答案,效果很好。非常感谢!
      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多