[英]How to create a new column in a dataframe using a multikey dictionary
我有一个多键字典,我想用它在数据框中创建一个新列。 使用单个关键数据帧执行此操作非常简单,但我不知道将两个值发送到字典的正确语法是什么。
我已经能够使用 map、get 和 apply 来使用单个键字典(地图示例)
import pandas as pd
df = pd.DataFrame(data = {'Col1': [1, 2, 3, 4], 'Col2': ['A', 'B', 'C', 'D']})
single_dict = {1: 'This', 2: 'is', 3: 'pretty', 4: 'easy'}
df['newcol_a'] = df['Col1'].map(single_dict)
print(df)```
返回预期的“
Col1 Col2 newcol_a
0 1 A This
1 2 B is
2 3 C pretty
3 4 D easy
但是当我创建一个多键字典时,比如
dbl_dict = {1: {'A': 'THIS', 'B': 'blah', 'C': 'blah', 'D': 'blah'},
2: {'A': 'blah', 'B': 'HAS' , 'C': 'blah', 'D': 'blah'},
3: {'A': 'blah', 'B': 'blah', 'C': 'ME' , 'D': 'blah'},
4: {'A': 'blah', 'B': 'blah', 'C': 'blah', 'D': 'STUMPED'},}
我可以使用“get”来调用它
dbl_dict.get(1, {}).get('A', 'Other')
Out[5]: 'THIS'
但我无法弄清楚语法(尝试了大约 40 种不同的东西,例如df['newcol_b'] = df[['Col1', 'Col2']].map(dbl_dict)
)以获得所需的结果:
Col1 Col2 newcol_a
0 1 A THIS
1 2 B HAS
2 3 C ME
3 4 D STUMPED
map
不知道如何处理嵌套的 dict。 如果你坚持使用这个 dict 你可以在整个数据帧上使用apply
但你必须创建一个自定义映射函数:
import pandas as pd
df = pd.DataFrame(data={'Col1': [1, 2, 3, 4], 'Col2': ['A', 'B', 'C', 'D']})
dbl_dict = {1: {'A': 'THIS', 'B': 'blah', 'C': 'blah', 'D': 'blah'},
2: {'A': 'blah', 'B': 'HAS', 'C': 'blah', 'D': 'blah'},
3: {'A': 'blah', 'B': 'blah', 'C': 'ME', 'D': 'blah'},
4: {'A': 'blah', 'B': 'blah', 'C': 'blah', 'D': 'STUMPED'}}
df['new_col'] = df.apply(lambda s: dbl_dict.get(s['Col1'], {}).get(s['Col2']), axis=1)
df
现在
Col1 Col2 new_col
0 1 A THIS
1 2 B HAS
2 3 C ME
3 4 D STUMPED
使用loc
(或at
)的解决方案可能是可能的(如果是这样,可能会更快)。 需要研究一下。
在我看来,您拥有的最简单的选择是使用嵌套字典创建一个新的 DataFrame 并取消堆叠此 DataFrame,然后您可以将其与原始 DataFrame 连接,如下所示:
s = pd.DataFrame(dbl_dict).unstack().rename_axis(('Col1','Col2')).rename('new_column')
print (s)
df = df.join(s, on=['Col1','Col2'])
print (df)
我创建了一个很小的(2 行)自定义函数供您使用,它似乎可以解决这个问题。 当然,这可以改进以捕获特定情况下的一些错误和行为。
import pandas as pd
data = {'col_1':[1,2,3,4],'col_2':['A','B','C','D']}
df = pd.DataFrame(data)
dbl_dict = {1: {'A': 'THIS', 'B': 'blah', 'C': 'blah', 'D': 'blah'},
2: {'A': 'blah', 'B': 'HAS' , 'C': 'blah', 'D': 'blah'},
3: {'A': 'blah', 'B': 'blah', 'C': 'ME' , 'D': 'blah'},
4: {'A': 'blah', 'B': 'blah', 'C': 'blah', 'D': 'STUMPED'},}
def maperino(dict_name,key_1,key_2):
val = [dict_name[key_1[i]][key_2[i]] for i in range(len(key_1))]
return val
df['col_3'] = maperino(dbl_dict,df['col_1'],df['col_2'])
print(df)
输出:
col_1 col_2 col_3
0 1 A THIS
1 2 B HAS
2 3 C ME
3 4 D STUMPED
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.