繁体   English   中英

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

[英]Can I join two data frames using one column in df1 and one of any values in a cell in df2?

我正在使用一些地理空间数据df_geo并且有一个CSV值,我想将其添加到位置数据框df_data

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

在此处输入图片说明

我的问题是这样的:如果该行在df_data名为“ Catalonia”,我将如何将df_data加入df_geo

由于行是唯一的一个区域,您可以创建在任何映射名称的字典'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'\\\\').values分割中的字符串VARNAME_1'\\'字符,并将在所有分隔值Series列表。 Series上使用.items会给您一个元组(我们将其拆包成两个单独的值),第一个值是索引,该索引与原始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为值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM