转置列Pandas Dataframes后梳理列

时间:2017-01-29 20:51:33

标签: python pandas numpy data-science

假设我有一组数据框

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

自从我转换数据框以来,我遇到了concat的问题。

感谢所有帮助

2 个答案:

答案 0 :(得分:2)

更新:已排序的数据集且无需转置:

E/MediaPlayer: Error (1,-2147483648)

<强>解释

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

现在我们可以从已排序的NumPy数组列表中创建一个DataFrame,并将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])] 指定为列:

d1.index

答案 1 :(得分:2)

设置

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]})

将(S)

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