这是一个自我回答的问题。给定两个数据帧,

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/

10-12 22:17