python - 在 Pandas 中外部加入三个数据框不起作用
问题描述
下面代码的目标是使用三个 pandas 数据帧实现 FULL OUTER JOIN。应该打印所有数据帧的所有记录,如果两个或三个记录之间有关系,那么它们应该打印在同一行。
用于关联数据帧的字段type_1
在id_1
第一个数据帧中,type_2
在id_2
第二个数据帧中type_3
,id_3
在第三个数据帧中。
问题是第二个和第三个数据帧之间的关系不起作用。看一下第 11 行和第 13 行的情况,它应该是一行,因为type_2
=type_3
和id_2
= id_3
。预期的输出在第 1111 NaN NaN NaN 7.0 8 KoKo 7.0 8 Kuku
行,不应打印第 13 行。如何解决这个问题?
import pandas as pd
raw_data = {
'type_1': [0, 1, 1, 2, 2],
'id_1': ['3', '4', '5', '3', '3'],
'name_1': ['Alex', 'Amy', 'Allen', 'Peter', 'Liz']}
df_a = pd.DataFrame(raw_data, columns = ['type_1', 'id_1', 'name_1' ])
raw_datab = {
'type_2': [1, 1, 1, 0,7],
'id_2': ['4', '5', '5', '7', '8'],
'name_2': ['Billy', 'Brian', 'Joe', 'Bryce', 'KoKo']}
df_b = pd.DataFrame(raw_datab, columns = ['type_2', 'id_2', 'name_2'])
raw_datac = {
'type_3': [1, 1, 1, 1, 2, 2, 7],
'id_3': ['4', '6', '5', '5', '3', '3','8'],
'name_3': ['School', 'White', 'Jane', 'Homer', 'Paul', 'Lorel', 'Kuku']}
df_c = pd.DataFrame(raw_datac, columns = ['type_3', 'id_3', 'name_3'])
merged = df_a
merged = merged.merge(df_b, how='outer', left_on=['type_1', 'id_1'],
right_on=['type_2', 'id_2'])
merged = merged.merge(df_c, how='outer', left_on=['type_1', 'id_1'],
right_on=['type_3', 'id_3'])
print(merged)
结果:
type_1 id_1 name_1 type_2 id_2 name_2 type_3 id_3 name_3
0 0.0 3 Alex NaN NaN NaN NaN NaN NaN
1 1.0 4 Amy 1.0 4 Billy 1.0 4 School
2 1.0 5 Allen 1.0 5 Brian 1.0 5 Jane
3 1.0 5 Allen 1.0 5 Brian 1.0 5 Homer
4 1.0 5 Allen 1.0 5 Joe 1.0 5 Jane
5 1.0 5 Allen 1.0 5 Joe 1.0 5 Homer
6 2.0 3 Peter NaN NaN NaN 2.0 3 Paul
7 2.0 3 Peter NaN NaN NaN 2.0 3 Lorel
8 2.0 3 Liz NaN NaN NaN 2.0 3 Paul
9 2.0 3 Liz NaN NaN NaN 2.0 3 Lorel
10 NaN NaN NaN 0.0 7 Bryce NaN NaN NaN
11 NaN NaN NaN 7.0 8 KoKo NaN NaN NaN
12 NaN NaN NaN NaN NaN NaN 1.0 6 White
13 NaN NaN NaN NaN NaN NaN 7.0 8 Kuku
解决方案
您需要先创建一个合并密钥merge
df_a[['key1','key2']]=df_a[['type_1', 'id_1']]
df_b[['key1','key2']]=df_b[['type_2', 'id_2']]
df_c[['key1','key2']]=df_c[['type_3', 'id_3']]
merged = df_a
merged = merged.merge(df_b, how='outer')
merged = merged.merge(df_c, how='outer')
merged.drop(['key1','key2'],1)
Out[81]:
type_1 id_1 name_1 type_2 id_2 name_2 type_3 id_3 name_3
0 0.0 3 Alex NaN NaN NaN NaN NaN NaN
1 1.0 4 Amy 1.0 4 Billy 1.0 4 School
2 1.0 5 Allen 1.0 5 Brian 1.0 5 Jane
3 1.0 5 Allen 1.0 5 Brian 1.0 5 Homer
4 1.0 5 Allen 1.0 5 Joe 1.0 5 Jane
5 1.0 5 Allen 1.0 5 Joe 1.0 5 Homer
6 2.0 3 Peter NaN NaN NaN 2.0 3 Paul
7 2.0 3 Peter NaN NaN NaN 2.0 3 Lorel
8 2.0 3 Liz NaN NaN NaN 2.0 3 Paul
9 2.0 3 Liz NaN NaN NaN 2.0 3 Lorel
10 NaN NaN NaN 0.0 7 Bryce NaN NaN NaN
11 NaN NaN NaN 7.0 8 KoKo 7.0 8 Kuku
12 NaN NaN NaN NaN NaN NaN 1.0 6 White
推荐阅读
- php - laravel 多对多关系枢轴数据保存为空
- javascript - 如何删除textarea中的自定义文本?
- database - 从前端用户的表单输入详细信息中获取数据库结果
- android - 启用缩小时 Google Places API 自动完成错误
- angular - 库组件中Domsanitizer的依赖注入
- python - 设计一种算法来找到两条路径之间的平均距离
- build - 在生产模式下构建会导致空白页面,而在开发模式下构建可以完美运行(Angular 8)
- java - 使用 Guava 的 EventBus 的注意事项
- java - AsyncTask 与
- java.lang.Object[] 不能转换为 java.lang.String[] - python - 如何确定 Tensorflow 模型需要多少 GPU 内存?