转置列 Pandas 数据帧后合并列

Combing Columns after Transposing Columns Pandas Dataframes

假设我有一组数据框

df1 是

   ID       C1
0  0  0.000000
1  1  0.538516
2  2  0.509902
3  3  0.648074
4  4  0.141421

df2 是

  ID        C1
0  0  0.538516
1  1  0.000000
2  2  0.300000
3  3  0.331662
4  4  0.608276

并且 df3 是

  ID        C1
0  0  0.509902
1  1  0.300000
2  2  0.000000
3  3  0.244949
4  4  0.509902

然后我继续转置这三个数据框。

df1 = df1.T
df2 = df2.T
df3 = df3.T

现在数据帧是:

df1 是

          0         1         2         3         4
ID        0         1         2         3         4
C1        0  0.538516  0.509902  0.648074  0.141421

df2 是:

                 0         1    2         3         4
ID               0         1    2         3         4
C1               0.538516  0  0.3  0.331662  0.608276

df3 是:

                 0    1    2         3         4
ID               0    1    2         3         4
C1          0.509902  0.3  0  0.244949  0.509902

我能否以某种方式组合所有数据帧以具有

0            1         2         3         4
0          0.538516  0.509902  0.648074  0.141421
0.538516     0        0.3       0.331662  0.608276
0.509902     0.3      0         0.244949  0.509902

然后分别对行进行排序,以便对结果数据框中的每一行进行排序?

例如,已排序行的数据框将是

0  0.141421  0.509902  0.538516  0.648074
0  0.3       0.331662  0.538516  0.608276
0  0.244949  0.3       0.509902  0.509902

我在转置数据帧后遇到了连接问题。

感谢所有帮助

更新: 已排序数据集且未转置:

In [64]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index)
Out[64]:
     0         1         2         3         4
0  0.0  0.141421  0.509902  0.538516  0.648074
1  0.0  0.300000  0.331662  0.538516  0.608276
2  0.0  0.244949  0.300000  0.509902  0.509902

解释:

In [67]: d1
Out[67]:
   ID        C1
0   0  0.000000
1   1  0.538516
2   2  0.509902
3   3  0.648074
4   4  0.141421

In [68]: d1['C1'].values
Out[68]: array([ 0.      ,  0.538516,  0.509902,  0.648074,  0.141421])

In [69]: np.sort(d1['C1'].values)
Out[69]: array([ 0.      ,  0.141421,  0.509902,  0.538516,  0.648074])

In [70]: [np.sort(x['C1'].values) for x in dfs]
Out[70]:
[array([ 0.      ,  0.141421,  0.509902,  0.538516,  0.648074]),
 array([ 0.      ,  0.3     ,  0.331662,  0.538516,  0.608276]),
 array([ 0.      ,  0.244949,  0.3     ,  0.509902,  0.509902])]

现在我们可以从已排序的 NumPy 数组列表创建一个 DataFrame,指定 d1.index 作为列:

In [71]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index)
Out[71]:
     0         1         2         3         4
0  0.0  0.141421  0.509902  0.538516  0.648074
1  0.0  0.300000  0.331662  0.538516  0.608276
2  0.0  0.244949  0.300000  0.509902  0.509902

设置

df1 = pd.DataFrame({
        'C1': [0.0, 0.538516, 0.509902, 0.648074, 0.141421],
        'ID': [0, 1, 2, 3, 4]})
df2 = pd.DataFrame({
        'C1': [0.538516, 0.0, 0.3, 0.331662, 0.608276],
        'ID': [0, 1, 2, 3, 4]})
df3 = pd.DataFrame({
        'C1': [0.509902, 0.3, 0.0, 0.244949, 0.509902],
        'ID': [0, 1, 2, 3, 4]})

解决方案

1

看起来您的 ID 专栏很重要,也许这就是您想加入的内容。我会将其设置为您的索引,然后合并。

为了对每一行进行排序,我将保留为列并应用 sort_values

df = pd.concat(
    [d.set_index('ID') for d in [df1, df2, df3]], ignore_index=True, axis=1)
df.apply(lambda x: x.sort_values().values).T

ID    0         1         2         3         4
0   0.0  0.141421  0.509902  0.538516  0.648074
1   0.0  0.300000  0.331662  0.538516  0.608276
2   0.0  0.244949  0.300000  0.509902  0.509902

2

获取数据框并按 numpy

排序
df = pd.concat([d.set_index('ID').T for d in [df1, df2, df3]], ignore_index=True)

v = df.values
a = v.argsort(1)
i = np.arange(a.shape[0])[:, None]
df.loc[:] = v[i, a]

df

ID    0         1         2         3         4
0   0.0  0.141421  0.509902  0.538516  0.648074
1   0.0  0.300000  0.331662  0.538516  0.608276
2   0.0  0.244949  0.300000  0.509902  0.509902