簡體   English   中英

如何在嵌套的 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

如果您將字典修剪為僅包含您需要的值,並與非常快的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM