pandas - 合并每个数据框中值略有不同的列上的数据框
问题描述
我正在尝试根据包含团队名称的列合并到数据框。
虽然球队的名字正确地写在了一个数据框中(“新英格兰爱国者队”、“纽约巨人队”......),但在第二个数据框中,名字是乱七八糟的,我只知道最后一个词队名仍然是最后一位('zapjizaPatriots'、'qdsjbGiants'..)。
我一直在想办法以某种方式pd.merge
同时使用正则表达式,但没有任何效果。
df1 : {'team': {1: 'New England Patriots', 2: 'Miami Dolphins', 3: 'Buffalo Bills', 4: 'New York Jets', 6: 'Baltimore Ravens'}, 'W': {1: 11, 2: 7, 3: 6, 4: 4, 6: 10}, 'L': {1: 5, 2: 9, 3: 10, 4: 12, 6: 6}, 'Ratio': {1: 2.2, 2: 0.7777777777777778, 3: 0.6, 4: 0.3333333333333333, 6: 1.6666666666666667}}
df2 : {'Metropolitan area': {0: 'New York City', 1: 'Los Angeles', 2: 'San Francisco Bay Area', 3: 'Chicago', 4: 'Dallas–Fort Worth'}, 'NFL': {0: 'GiantsJets', 1: 'RamsChargers', 2: '49ersRaiders', 3: 'Bears', 4: 'Cowboys'}}
解决方案
我以您的df1
,df2
为例。首先,我们需要创建一个列,它是团队名称中的最后一个单词。对于 df1,它很容易在空格上拆分。对于df2
我们拆分大写字母,将拆分的字母保留在列表中,然后组合最后两个元素:
df1['token'] = df1['team'].str.split().apply(lambda l:l[-1])
df2['token'] = df2['NFL'].str.split('([A-Z])').apply(lambda l:l[-2]+l[-1])
例如,我们得到 df2:
Metropolitan area NFL token
-- ---------------------- ------------ --------
0 New York City GiantsJets Jets
1 Los Angeles RamsChargers Chargers
2 San Francisco Bay Area 49ersRaiders Raiders
3 Chicago Bears Bears
4 Dallas–Fort Worth Cowboys Cowboys
现在我们可以合并token
:
df1.merge(df2,on='token',how='left')
结果不是很有趣,因为只有一场比赛,但希望能在你的完整 dfs 上起作用:
team W L Ratio token Metropolitan area NFL
-- -------------------- --- --- -------- -------- ------------------- ----------
0 New England Patriots 11 5 2.2 Patriots nan nan
1 Miami Dolphins 7 9 0.777778 Dolphins nan nan
2 Buffalo Bills 6 10 0.6 Bills nan nan
3 New York Jets 4 12 0.333333 Jets New York City GiantsJets
4 Baltimore Ravens 10 6 1.66667 Ravens nan nan
推荐阅读
- kubernetes - 无法使用 kubectl 连接到我的私有集群(无法连接到服务器:拨号 tcp)
- javascript - JS Doc,有没有办法指定“Choice”参数?
- python - 满足条件时如何在字符之间添加空格?
- javascript - 缺少资源的全局 JavaScript 事件
- python - Pytorch 张量操作给了我不同的输出
- android - 远程配置替代方案:存储 UI 特定参数
- azure-data-factory - 尝试从 Azure 数据工厂中针对每个活动命中 API 时出现 429 错误
- python - 如果单击图像中框的周边,则绘制一个框
- php - index.php 没有获取 GET 变量,但 index.php?name=Joe 是(ESP8266)
- laravel - .isDirty 在提交并重新加载 InertiaJS 页面后为 true