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

Posted

技术标签:

【中文标题】如何在嵌套的 Python 字典中搜索匹配的数据框值,然后更新数据框?【英文标题】:How do I search a nested Python dictionary for a matching dataframe value and then update the dataframe? 【发布时间】:2021-10-20 16:54:32 【问题描述】:

我有一个包含公司信息的 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”匹配后停止。我一直试图弄清楚为什么会这样。为什么这种方法不起作用?我如何完成这项任务?非常非常感谢您的帮助。

【问题讨论】:

对您的代码进行了一些尝试。在找到第一个匹配项后,它会爆发(因为你有一个返回键),所以它不能返回并搜索 B 或任何其他值 【参考方案1】:

从字典中创建一个数据框并与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

【讨论】:

非常感谢您的帮助。有没有办法在不将字典转换为 df 并将其合并到数据帧的情况下做到这一点? 有什么理由不想转换为数据框? 我使用的实际数据框和字典要大得多,合并它们只会让人不知所措。对于数据框中的每个项目,我一次只需要字典中的几条信息。所以我想我认为字典方法会更可行?或者也许我应该以其他方式在两个数据集之间建立一个关系数据库?感谢您对此的帮助。真的很感激。我是编码新手,刚刚在这一步上被我的项目卡住了。 我也很困惑,为什么我上面尝试的字典方法在第一个字典项之后停止,并且想了解原因。谢谢。 留下评论为什么我认为您的代码没有超出第一个匹配项;还使用另一个解决方案进行了一些编辑

以上是关于如何在嵌套的 Python 字典中搜索匹配的数据框值,然后更新数据框?的主要内容,如果未能解决你的问题,请参考以下文章

列表中的嵌套字典到数据框python

用 Pandas 数据框中的行填充嵌套字典

Python Pandas:将嵌套字典转换为数据框

从嵌套字典列表中获取熊猫数据框

在 Pandas Dataframe 列中的嵌套字典中搜索和替换

在嵌套 Python 字典中搜索键