python - 在索引上合并 Panda DataFrame,添加额外的列,并且没有重复的索引
问题描述
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])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df22 = pd.DataFrame({'A2': ['A4', 'A5', 'A6', 'A7'],
'B2': ['B4', 'B5', 'B6', 'B7'],
'C2': ['C4', 'C5', 'C6', 'C7'],
'D2': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
frames = [df1, df2, df22]
result = pd.concat(frames,sort=False)
result
如我们所见,索引 4、5、6、7 重复,并添加了 NAN。 如何有意义地合并..?
NaN at A2 ,B2 ,C2, D2, 在索引 0,1,2,3 是可以接受的
但索引 4、5、6、7 不应重复且不应包含 NaN
解决方案
你想要这样的东西吗?您可以使用数据帧索引pd.concat
将前两个数据帧垂直join
转换为 df22。
pd.concat([df1,df2]).join(df22)
输出:
A B C D A2 B2 C2 D2
0 A0 B0 C0 D0 NaN NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN NaN
2 A2 B2 C2 D2 NaN NaN NaN NaN
3 A3 B3 C3 D3 NaN NaN NaN NaN
4 A4 B4 C4 D4 A4 B4 C4 D4
5 A5 B5 C5 D5 A5 B5 C5 D5
6 A6 B6 C6 D6 A6 B6 C6 D6
7 A7 B7 C7 D7 A7 B7 C7 D7
另一种方法是使用combine_first
:
from functools import reduce
reduce(lambda x,y: x.combine_first(y), [df1,df2,df22])
或者
df1.combine_first(df2).combine_first(df22)
输出:
A A2 B B2 C C2 D D2
0 A0 NaN B0 NaN C0 NaN D0 NaN
1 A1 NaN B1 NaN C1 NaN D1 NaN
2 A2 NaN B2 NaN C2 NaN D2 NaN
3 A3 NaN B3 NaN C3 NaN D3 NaN
4 A4 A4 B4 B4 C4 C4 D4 D4
5 A5 A5 B5 B5 C5 C5 D5 D5
6 A6 A6 B6 B6 C6 C6 D6 D6
7 A7 A7 B7 B7 C7 C7 D7 D7
推荐阅读
- windows - 如何使用 cmd 删除 Windows 目录?
- javascript - 帖子不按顺序排列。想在顶部显示最新的帖子
- c# - 在 Excel Web 插件开发 Visual Studio 中使用项目应用程序设置
- python - 如何将 csv 文件读取到 numpy 数组,包括第 0 个索引中的列名
- swift - 这种 Swift 语法的长格式
- javascript - MaterialUI 值道具在值状态更改后不更新组件的动态渲染
- c++ - GLSL 点积问题
- gpu - 如果我们在 CUDA/GPU 中为每个 warp 划分一个块,那么一个块中的所有 warp 都使用相同的共享内存
- pandas - 以小时 (4,5 h) 为单位添加时间到某个时间
- google-bigquery - BQ 脚本在作曲家中失败