python - 我可以使用 df1 中的一列和 df2 单元格中的任何值之一连接两个数据框吗?
问题描述
我正在处理一些地理空间数据,df_geo
并且我有一个我想加入位置数据框的 CSV 值,称为df_data
.
然而,我的问题是,有多种方法可以拼写列中的值,我想在(区域名称)上加入两个数据框。请看下面的加泰罗尼亚示例,df_geo
其中: 有6 种不同的拼写区域名称的方式,具体取决于语言。
我的问题是:如果该行在 中被命名为“加泰罗尼亚” df_data
,我将如何df_data
加入df_geo
?
解决方案
由于行对于区域是唯一的,因此您可以创建一个字典,将任何名称映射'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'\\').values
VARNAME_1
在字符上拆分字符串'\'
并将所有分隔值放在Series
列表中。使用.items
onSeries
会给你一个元组(我们将它解压缩成两个单独的值),第一个值是索引,它与原始的索引相同,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
为值。
推荐阅读
- javascript - 如何显示来自特定索引位置的表数据
- php - 从 MySQL 中的序列化列中搜索数据
- angular - 如何检测路由何时更改并在Angular中替换新视图
- node.js - 如何在不使用 findById 的情况下填充页面中的所有子模式?
- r - 将列名与 R 中的列数据连接起来(使用 data.table)
- cross-browser - yocto krogoth 版本中的 qupzilla 编译错误
- opencv - CV_GET_SEQ_ELEM abort() 已被调用
- laravel - 如何同时从 oauth 认证两种类型的用户。并且在每个请求标头中都需要两个用户凭据
- apache-spark - Spark Streaming中批处理间隔、滑动间隔和窗口大小的区别
- java - Java 应用程序的 Docusign OAuth getAccessToken 失败