首页 > 解决方案 > 我可以使用 df1 中的一列和 df2 单元格中的任何值之一连接两个数据框吗?

问题描述

我正在处理一些地理空间数据,df_geo并且我有一个我想加入位置数据框的 CSV 值,称为df_data.

然而,我的问题是,有多种方法可以拼写列中的值,我想在(区域名称)上加入两个数据框。请看下面的加泰罗尼亚示例,df_geo其中: 有6 种不同的拼写区域名称的方式,具体取决于语言。

在此处输入图像描述

我的问题是:如果该行在 中被命名为“加泰罗尼亚” df_data,我将如何df_data加入df_geo

标签: pythonpandasjoin

解决方案


由于行对于区域是唯一的,因此您可以创建一个字典,将任何名称映射'VARNAME_1'到从df_geo.

然后使用它来将名称映射df_data到一个虚拟列,您可以对 in 中的索引df_geo和中的映射列进行简单的合并df_data

要获取字典,请执行以下操作:

d = dict((y,ids) for ids, val in df_geo.VARNAME_1.str.split(r'\\').items() 
                 for y in val)

样本数据:

import pandas as pd
df_geo = pd.DataFrame({'VARNAME_1': ['Catalogna\Catalogne\Catalonia', 'A\B\C\D\E\F\G']})
df_data = pd.DataFrame({'Name': ['Catalogna', 'Seven', 'E'],
                        'Vals': [1,2,3]})

代码

d = dict((y,ids) for ids, val in df_geo.VARNAME_1.str.split(r'\\').items() 
                 for y in val)
#{'A': 1,
# 'B': 1,
# 'C': 1,
# 'Catalogna': 0,
# 'Catalogne': 0,
# 'Catalonia': 0,
# 'D': 1,
# 'E': 1,
# 'F': 1,
# 'G': 1}

df_data['ID'] = df_data.Name.map(d)
df_data.merge(df_geo, left_on='ID', right_index=True, how='left').drop(columns='ID')

输出:

        Name  Vals                      VARNAME_1
0  Catalogna     1  Catalogna\Catalogne\Catalonia
1      Seven     2                            NaN
2          E     3                  A\B\C\D\E\F\G

字典是如何工作的。

df_geo.VARNAME_1.str.split(r'\\').valuesVARNAME_1在字符上拆分字符串'\'并将所有分隔值放在Series列表中。使用.itemsonSeries会给你一个元组(我们将它解压缩成两个单独的值),第一个值是索引,它与原始的索引相同,DataFrame第二个项目是

for ids, val in df_geo.VARNAME_1.str.split(r'\\').items():
    print(f'id:{ids} and val:{val}')
#id:0 and val:['Catalogna', 'Catalogne', 'Catalonia']
#id:1 and val:['A', 'B', 'C', 'D', 'E', 'F', 'G']

所以现在val是一个列表,我们再次想要迭代它以创建字典。

for ids, val in df_geo.VARNAME_1.str.split(r'\\').items():
    for y in val:
        print(f'id:{ids} and y:{y}')
#id:0 and y:Catalogna
#id:0 and y:Catalogne
#id:0 and y:Catalonia
#id:1 and y:A
#id:1 and y:B
#id:1 and y:C
#id:1 and y:D
#id:1 and y:E
#id:1 and y:F
#id:1 and y:G

所以我创建的字典是以 y 为键,以原始 DataFrame 索引ids为值。


推荐阅读