我可以使用df1中的一列和df2中的单元格中的任何值之一来连接两个数据帧吗?

时间:2018-09-21 18:58:32

标签: python pandas join

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

但是,我的问题是,有多种方法可以拼写我想将(区域名称)上的两个数据框连接起来的列中的值。请看下面df_geo中加泰罗尼亚的示例:取决于语言,有 6种不同的拼写区域名称的方法

enter image description here

我的问题是:如果该行在df_data中被命名为“ Catalonia”,那么我该如何将df_datadf_geo联接起来?

1 个答案:

答案 0 :(得分:1)

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

然后使用它将df_data中的名称映射到虚拟列,您可以对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中。在.items上使用Series会得到一个元组(我们将其拆包成两个单独的值),第一个值是索引,该索引与原始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作为值。