我正在处理df_geo
的一些地理空间数据,并且有一个CSV值,我想加入到位置数据框中,称为df_data
。
但是,我的问题是,有多种方法可以拼写我想将(区域名称)上的两个数据框连接起来的列中的值。请看下面df_geo
中加泰罗尼亚的示例:取决于语言,有 6种不同的拼写区域名称的方法。
我的问题是:如果该行在df_data
中被命名为“ Catalonia”,那么我该如何将df_data
与df_geo
联接起来?
答案 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'\\').values
在VARNAME_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
作为值。