python - 熊猫连接具有重复索引的列
问题描述
我有两个要水平连接的数据框,按列的值对它们进行分组。他们从pandas.pydata 网站:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
df1 =
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
df4 =
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
result = pd.concat([df1, df4], axis=1, join='inner')
result =
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
这行得通,我很高兴。所以我使用这个技巧通过某个列的值合并 2 个数据帧,基本上我用该列重新索引数据帧,然后我进行连接。但是该列中的值是重复的,因此我以具有重复索引的数据框结尾:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 3, 3, 2])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
df1 =
A B C D
0 A0 B0 C0 D0
3 A1 B1 C1 D1
3 A2 B2 C2 D2
2 A3 B3 C3 D3
df4 =
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
所以我希望这两个数据框能够加入,所以我最终会得到:
result =
A B C D B D F
3 A1 B1 C1 D1 B2 D2 F2
3 A2 B2 C2 D2 B2 D2 F2
2 A3 B3 C3 D3 B3 D3 F3
(请注意,df1 中索引为 3 的两行都与 df4 中索引为 3 的行连接)但是这不起作用。
ValueError: Shape of passed values is (7, 5), indices imply (7, 3)
我怎样才能做到这一点?f 我可以避免按索引合并,但我可以指定一个列,这样会更好
解决方案
merge
按索引匹配的一种可能解决方案,默认how='inner'
应省略:
result = pd.merge(df1, df4, left_index=True, right_index=True)
print (result)
A B_x C D_x B_y D_y F
2 A3 B3 C3 D3 B2 D2 F2
3 A1 B1 C1 D1 B3 D3 F3
3 A2 B2 C2 D2 B3 D3 F3
它创建重复匹配行的组合:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 3, 3, 3])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 3, 7])
print (df1)
A B C D
0 A0 B0 C0 D0
3 A1 B1 C1 D1
3 A2 B2 C2 D2
3 A3 B3 C3 D3
print (df4)
B D F
2 B2 D2 F2
3 B3 D3 F3
3 B6 D6 F6
7 B7 D7 F7
result = pd.merge(df1, df4, left_index=True, right_index=True)
print (result)
A B_x C D_x B_y D_y F
3 A1 B1 C1 D1 B3 D3 F3
3 A1 B1 C1 D1 B6 D6 F6
3 A2 B2 C2 D2 B3 D3 F3
3 A2 B2 C2 D2 B6 D6 F6
3 A3 B3 C3 D3 B3 D3 F3
3 A3 B3 C3 D3 B6 D6 F6
推荐阅读
- python - Python BeautifulSoup 输出异常的间距和字符
- python - Backtrader 错误:“DataFrame”对象没有属性“setenvironment”
- javascript - 数据在 redux-reducer 中被覆盖
- blob - 通过 Azure 数据工厂将数据从 Blob 复制到 SQL
- r - 如何在 Mac 上的 R 中设置 png 的分辨率
- python - 在python中提取标签之间的内容
- python-3.x - 删除数字,但如果它们是字符串的一部分,则不删除
- lua - 如何在 StackExchange.Redis 中正确加载 Lua 脚本?
- vue.js - Vue webpacks 的不同类型,如果需要在 vue 中构建主题,哪个适合选择?
- pixi.js - 在 PixiJS 中,是否可以在透明渲染纹理中应用混合模式与后面的图层一起使用?