2016-08-02 159 views
4

我有两个(数百)df被生成然后连接,然后我想排序,同时保留具有相同列D名称的行的原始顺序:按一列的值排序,保留行按另一列的值分组

In [120]: df_list[0] 
Out[120]: 

    A   B   C   D 
0 0.564678 0.598355 0.606693 MA0835 
1 0.066291 0.063587 0.662292 MA0835 
2 0.000000 0.000000 0.010758 MA0835 
3 0.000000 0.000000 0.097895 MA0835 
4 0.000000 0.000000 0.136468 MA0835 

In [121]: df_list[1] 
Out[121]: 

    A   B   C   D 
0 0.628844 0.614492 0.570333 MA1002 
1 0.317790 0.293189 0.239368 MA1002 
2 0.000000 0.000000 0.000000 MA1002 
3 0.000000 0.000000 0.000000 MA1002 
4 0.000000 0.000000 0.000000 MA1002 

In [122]: df = pd.concat(df_list[0:2]) 

In [122]: df 
Out[122]: 
    A   B   C   D 
0 0.564678 0.598355 0.606693 MA0835 
1 0.066291 0.063587 0.662292 MA0835 
2 0.000000 0.000000 0.010758 MA0835 
3 0.000000 0.000000 0.097895 MA0835 
4 0.000000 0.000000 0.136468 MA0835 
0 0.628844 0.614492 0.570333 MA1002 
1 0.317790 0.293189 0.239368 MA1002 
2 0.000000 0.000000 0.000000 MA1002 
3 0.000000 0.000000 0.000000 MA1002 
4 0.000000 0.000000 0.000000 MA1002 

标准排序产生:

In [125]: df.sort_values('A',ascending=False) 
Out[125]: 
    A   B   C   D 
0 0.628844 0.614492 0.570333 MA1002 
0 0.564678 0.598355 0.606693 MA0835 
1 0.317790 0.293189 0.239368 MA1002 
1 0.066291 0.063587 0.662292 MA0835 
2 0.000000 0.000000 0.010758 MA0835 
3 0.000000 0.000000 0.097895 MA0835 
4 0.000000 0.000000 0.136468 MA0835 
2 0.000000 0.000000 0.000000 MA1002 
3 0.000000 0.000000 0.000000 MA1002 
4 0.000000 0.000000 0.000000 MA1002 

不过,我想通过D指定排序A,保持行分组。这是所需的输出:

A   B   C   D 
0 0.628844 0.614492 0.570333 MA1002 
1 0.317790 0.293189 0.239368 MA1002 
2 0.000000 0.000000 0.000000 MA1002 
3 0.000000 0.000000 0.000000 MA1002 
4 0.000000 0.000000 0.000000 MA1002 
0 0.564678 0.598355 0.606693 MA0835 
1 0.066291 0.063587 0.662292 MA0835 
2 0.000000 0.000000 0.010758 MA0835 
3 0.000000 0.000000 0.097895 MA0835 
4 0.000000 0.000000 0.136468 MA0835 

我需要用groupby工作,或者是有其他的排序/分组技术我不熟悉?

+0

是“d”的绝对顺序很重要,或者是可以接受的,如果顺序是按字母顺序排列? – Grr

+0

与每个'D'相关的5行应该保持相同的顺序,因为每个'D'的索引指示。 – AGS

+0

我的错,我不清楚。 'D'中每5行分组的顺序是否重要?例如,如果MA0835组位于MA1002组之前,那么它是可以接受的吗? – Grr

回答

2

使用keys论点pd.concat

keys = [(df.A.iloc[0], i) for i, df in enumerate(list_of_dfs)] 
pd.concat(list_of_dfs, keys=keys) \ 
    .sort_index(ascending=[False, True, True]) \ 
    .reset_index(drop=True) 

enter image description here

+0

这让我更接近。我是不够清楚,虽然 - 在结束时,每个d的“块”的顺序并不重要,只要整个DF是每个索引处的'A'值排序0 – AGS

+0

@AGS答案一直更新 – piRSquared

+0

新的答案效果很好 - 除非在'df.A.iloc [0]'中有相同的值。 'InvalidIndexError:重建索引只与唯一价值指数objects' – AGS