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