python - Pandas 根据字典中描述的关系加入两个数据框
问题描述
我有两个要根据列表字典中描述的关系加入的数据框,其中字典中的键引用 dfA idA 列中的 id,列表中的项目是 dfB idB 列中的 id。数据框和字典看起来像这样:
dfA
colA colB idA
0 a abc 3
1 b def 4
2 b ghi 5
dfB
colX idB colZ
0 bob 7 a
1 bob 7 b
2 bob 7 c
3 jim 8 d
4 jake 9 a
5 jake 9 e
myDict = { '3': [ '7', '8' ], '4': [], '5': ['7', '9'] }
如何使用 myDict 连接两个数据框以生成如下所示的数据框?
dfC
colA colB idA colX idB colZ
0 a abc 3 bob 7 a
1 b
2 c
3 jim 8 d
4 b def 4 None None None
5 b ghi 5 bob 7 a
6 b
7 c
8 jake 9 a
9 e
解决方案
您可以从字典创建链接表 (DataFrame)。下面是完整的工作示例。最后可能需要对行和列进行一些排序才能准确地产生您的输出。
import pandas as pd
import numpy as np
dfA = pd.DataFrame({'colA': ('a', 'b', 'b'),
'colB': ('abc', 'def', 'ghi'),
'idA': ('3', '4', '5')})
dfB = pd.DataFrame({'colX': ('bob', 'bob', 'bob', 'jim', 'jake', 'jake'),
'idB': ('7', '7', '7', '8', '9', '9'),
'colZ': ('a', 'b', 'c', 'd', 'a', 'e')})
myDict = {'3': ['7', '8'], '4': [], '5': ['7', '9']}
dfC = pd.DataFrame(columns=['idA', 'idB'])
i = 0
for key, value in myDict.items():
# the if statement is for empty list to create one record with NaNs
if not value:
dfC.loc[i, 'idA'] = key
dfC.loc[i, 'idB'] = np.nan
i += 1
for val in value:
dfC.loc[i, 'idA'] = key
dfC.loc[i, 'idB'] = val
i += 1
temp = dfA.merge(dfC, how='right')
result = temp.merge(dfB, how='outer')
print(result)
输出是:
colA colB idA idB colX colZ
0 a abc 3 7 bob a
1 a abc 3 7 bob b
2 a abc 3 7 bob c
3 b ghi 5 7 bob a
4 b ghi 5 7 bob b
5 b ghi 5 7 bob c
6 a abc 3 8 jim d
7 b def 4 NaN NaN NaN
8 b ghi 5 9 jake a
9 b ghi 5 9 jake e
推荐阅读
- pyspark - 如何使用 pyspark 连接到独立的 cassandra?
- swift - 在 SwiftUI 上按 3 列出项目
- visual-studio-code - 如何将vscode扩展WebView设置到窗口底部?
- arrays - 有没有办法导入html表并跳过重复的列标题?
- components - Svelte - 组件一如何使用组件二的功能?
- c# - 如何修复“AmbiguousMatchException:请求匹配多个端点。”
- javascript - (Java NetBeans MVC) Javascript 链接文件不起作用?
- entity-framework - 响应式 UI 设计导致 Blazor 应用程序中的实体框架出现问题
- python - click() 在难以导航的网站上不起作用
- azure-active-directory - 使用 MSAL 实现 AAD 身份验证时,我将使用 navigateToLoginRequestUrl 选项做什么?