基于其他列和字典

时间:2017-03-13 15:03:54

标签: python pandas dictionary dataframe

假设我有一个至少有两列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

它应该与" map"类似,如此处所述Adding a new pandas column with mapped value from a dictionary

但我依靠两列。请问有人帮我吗?

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

我希望我的问题很明确。

谢谢你,Nadja

3 个答案:

答案 0 :(得分:2)

我认为具有无穷功能的简单pandas.DataFrame.apply应该可以正常工作:

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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