繁体   English   中英

根据其他列和字典创建一个新列

[英]Create a new column based on other columns and a dictionary

假设我有一个至少包含两列col1和col2的数据框。 我也有字典的字典,其键由col1 resp中的值组成。 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

它应该类似于“地图”,如此处所述。在字典中添加具有映射值的新pandas列

但是我依靠两列。 有人可以帮我吗?

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

我希望我的问题很清楚。

谢谢你,Nadja

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

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

您确定所需的输出正确吗? x1-y0在您的表格中为0。 如果是这样,这将起作用并且仅利用熊猫的内部功能,希望它们能得到很好的优化:

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

应该可以通过以下方式使用列表理解:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM