这是一个自我回答的问题。给定两个数据帧,
x
0 1
0 1 2
1 3 4
y
0 1 2
0 5 6 7
1 8 9 X
2 Y Z 0
x和y的对角线连接由以下公式给出:
0 1 3 4 5
0 1.0 2.0 NaN NaN NaN
1 3.0 4.0 NaN NaN NaN
2 NaN NaN 5 6 7
3 NaN NaN 8 9 X
4 NaN NaN Y Z 0
最简单最简单的方法是什么?我想考虑两个案例:
连接两个数据帧
连接未指定数量的数据帧(数据帧列表)
最佳答案
首先,简单的例子。假设头和索引都是单调的数字,您可以将y
的索引器修改为来自x
的偏移量:
y.index += x.index[-1] + 1
y.columns += x.columns[-1] + 1
pd.concat([x, y])
0 1 2 3 4
0 1.0 2.0 NaN NaN NaN
1 3.0 4.0 NaN NaN NaN
2 NaN NaN 5 6 7
3 NaN NaN 8 9 X
4 NaN NaN Y Z 0
现在,为了将其推广到多个数据帧,我们遍历一个循环:
df_list = [x, y]
offset_x = offset_y = 0
for df in df_list:
df.index = np.arange(len(df)) + offset_x
df.columns = np.arange(len(df.columns)) + offset_y
offset_x += df.index[-1] + 1
offset_y += df.columns[-1] + 1
pd.concat(df_list)
0 1 2 3 4
0 1.0 2.0 NaN NaN NaN
1 3.0 4.0 NaN NaN NaN
2 NaN NaN 5 6 7
3 NaN NaN 8 9 X
4 NaN NaN Y Z 0
如果索引/列不是单调增加的,我强烈建议在连接之前重置它们,或者查看下面的选项。
如果可以使用0s而不是NaNs,则可以使用
scipy
'sblock_diag
,而无需修改索引或列:from scipy.linalg import block_diag
pd.DataFrame(block_diag(*df_list))
0 1 2 3 4
0 1 2 0 0 0
1 3 4 0 0 0
2 0 0 5 6 7
3 0 0 8 9 X
4 0 0 Y Z 0
将此解决方案归功于this answer。
关于python - 对角Concat DataFrames,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50659623/