2017-01-29 60 views
2

假设我有一组数据帧精梳列移调列熊猫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 

然后我去ahea d并转置这三个数据帧。

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

UPDATE:排序的数据集和而不调换:

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数组,指定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 
+0

谢谢您的回答!我将如何做排序每行?自从C1失利以后,我会问这个问题。如果这是一个微不足道的问题,我很抱歉,我对熊猫非常陌生。 – Anant

+0

@安南,你会有相同的顺序,在'dfs'列表 – MaxU

+0

排序不可能?我对基于C1的转置数据帧进行排序。然而,排序的顺序在使用concat时丢失了。我认为它是因为指数是在串联中一起排列的。任何方式来解决这个问题? – Anant

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)

看起来好像你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 

让您的数据帧和排序在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 
+0

感谢您的回答!我将如何做排序每行?自从C1失利以后,我会问这个问题。另外,如果我在转置时对每一行进行排序,在连接数据框后排序的顺序会丢失。 – Anant

+1

@Anant在您的问题中未指定。我不明白你的评论需要什么。跟进另一个发布的问题会更好。这样,您可以包含更多信息,特别是关于您想要查看的内容。 – piRSquared

+0

我已经添加了详细的问题。谢谢! – Anant