如何在嵌套的Python字典中搜索匹配的数据框架值,然后更新数据框架?



我有一个包含公司信息的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循环似乎在第一个company "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

你的代码可以更清晰和更快,如果你修剪字典,只有你需要的值,并结合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

相关内容

  • 没有找到相关文章

最新更新