如何在嵌套的 Python 字典中搜索匹配的数据框值,然后更新数据框?
How do I search a nested Python dictionary for a matching dataframe value and then update the dataframe?
我有一本 Python 字典,其中包含公司信息,其结构如下:
co_dict = {'0': {'co_name': 'A',
'company_type': 'Public',
'global_name': 'A PARENT',
'sales': '1000'},
'1': {'co_name': 'B',
'company_type': 'Public',
'global_name': 'B PARENT',
'sales': '1000'}}
还有一个看起来像这样的 Pandas 数据框(真正的 df 长得多):
df = pd.DataFrame({'co-name': ['M','A','B','F'], 'co-number': [1,2,3,4]})
co-name co-number
0 M 1
1 A 2
2 B 3
3 F 4
我想在字典中为每个 df["co-name"] 找到匹配项,并将“global_name”和“sales”的相应字典值附加到 df 中的新列。当没有匹配项时,列都应显示为“n/a”。所以最终结果看起来像这样:
co-name co-number global_name sales
0 M 1 n/a n/a
1 A 2 A PARENT 1000
2 B 3 B PARENT 2000
3 F 4 n/a n/a
我尝试按如下方式执行此操作:
def find_global_name(x):
for key1 in co_dict.keys():
if (x['co-name'] == co_dict[key1]['co_name']):
return co_dict[key1]['global_name']
else:
return "n/a"
df['global_name'] = df.apply(find_global_name, axis=1)
但是 for 循环似乎在第一个公司“A”匹配后停止。我一直在试图弄清楚为什么会这样。为什么这种方法不起作用?我如何完成这个任务?非常非常感谢您的帮助。
从字典创建数据框并与 df
合并
(df.merge(pd.DataFrame(co_dict).T,
left_on = 'co-name',
right_on = 'co_name',
how = 'left')
.drop(columns=['co_name', 'company_type'])
)
co-name co-number global_name sales
0 M 1 NaN NaN
1 A 2 A PARENT 1000
2 B 3 B PARENT 1000
3 F 4 NaN NaN
如果您 trim 字典只包含您需要的值,并与 map
相结合,您的代码会更加清晰和快速......这也可以让您避免编写可能没有必要的代码:
为您需要的值创建字典:
global_name = {val['co_name']: val['global_name']
for _, val in co_dict.items()}
sales = {val['co_name']: val['sales']
for _, val in co_dict.items()}
global_name
{'A': 'A PARENT', 'B': 'B PARENT'}
sales
{'A': '1000', 'B': '1000'}
将字典映射到数据框以创建新列(此处假设列中的值是唯一的;否则,这将不起作用,合并是更好的选择,因为它可以处理重复项):
df.assign(global_name = df['co-name'].map(global_name),
sales = df['co-name'].map(sales))
Out[722]:
co-name co-number global_name sales
0 M 1 NaN NaN
1 A 2 A PARENT 1000
2 B 3 B PARENT 1000
3 F 4 NaN NaN
我有一本 Python 字典,其中包含公司信息,其结构如下:
co_dict = {'0': {'co_name': 'A',
'company_type': 'Public',
'global_name': 'A PARENT',
'sales': '1000'},
'1': {'co_name': 'B',
'company_type': 'Public',
'global_name': 'B PARENT',
'sales': '1000'}}
还有一个看起来像这样的 Pandas 数据框(真正的 df 长得多):
df = pd.DataFrame({'co-name': ['M','A','B','F'], 'co-number': [1,2,3,4]})
co-name co-number
0 M 1
1 A 2
2 B 3
3 F 4
我想在字典中为每个 df["co-name"] 找到匹配项,并将“global_name”和“sales”的相应字典值附加到 df 中的新列。当没有匹配项时,列都应显示为“n/a”。所以最终结果看起来像这样:
co-name co-number global_name sales
0 M 1 n/a n/a
1 A 2 A PARENT 1000
2 B 3 B PARENT 2000
3 F 4 n/a n/a
我尝试按如下方式执行此操作:
def find_global_name(x):
for key1 in co_dict.keys():
if (x['co-name'] == co_dict[key1]['co_name']):
return co_dict[key1]['global_name']
else:
return "n/a"
df['global_name'] = df.apply(find_global_name, axis=1)
但是 for 循环似乎在第一个公司“A”匹配后停止。我一直在试图弄清楚为什么会这样。为什么这种方法不起作用?我如何完成这个任务?非常非常感谢您的帮助。
从字典创建数据框并与 df
(df.merge(pd.DataFrame(co_dict).T,
left_on = 'co-name',
right_on = 'co_name',
how = 'left')
.drop(columns=['co_name', 'company_type'])
)
co-name co-number global_name sales
0 M 1 NaN NaN
1 A 2 A PARENT 1000
2 B 3 B PARENT 1000
3 F 4 NaN NaN
如果您 trim 字典只包含您需要的值,并与 map
相结合,您的代码会更加清晰和快速......这也可以让您避免编写可能没有必要的代码:
为您需要的值创建字典:
global_name = {val['co_name']: val['global_name']
for _, val in co_dict.items()}
sales = {val['co_name']: val['sales']
for _, val in co_dict.items()}
global_name
{'A': 'A PARENT', 'B': 'B PARENT'}
sales
{'A': '1000', 'B': '1000'}
将字典映射到数据框以创建新列(此处假设列中的值是唯一的;否则,这将不起作用,合并是更好的选择,因为它可以处理重复项):
df.assign(global_name = df['co-name'].map(global_name),
sales = df['co-name'].map(sales))
Out[722]:
co-name co-number global_name sales
0 M 1 NaN NaN
1 A 2 A PARENT 1000
2 B 3 B PARENT 1000
3 F 4 NaN NaN