2016-09-11 7 views
1

私はソートされていないデータフレームを持っています。 ABCおよびDの列を降順(最大から最小)で並べ替える必要がありますが、それらは金種グループに残る必要があります。たとえば、列,B,CおよびDによって金種100をソートする必要があるので、行0,1,2は0,2,1に変更されます。データフレーム内の特定の行を列別に並べ替えます。

Index Denomination A B C D 
0  100   5 0 0 0 
1  100   0 0 1 0 
2  100   0 2 0 0 
3  200   5 2 0 0 
4  200   5 0 1 0 
5  200   0 4 0 0 
6  200   10 0 0 0 
7  200   0 2 1 0 
8  200   0 0 2 0 

ソートレベルの順序はABC、次いでDでなければなりません。名前を変更するとIndexは重要ではありません。 結果のデータフレームは次のようになります。

Index Denomination A B C D 
0  100   5 0 0 0 
2  100   0 2 0 0 
1  100   0 0 1 0 
6  200   10 0 0 0 
3  200   5 2 0 0 
4  200   5 0 1 0 
5  200   0 4 0 0 
7  200   0 2 1 0 
8  200   0 0 2 0 

これは、行を選択して、カスタムの並べ替えを適用することで、Excelで行うことができますが、私はそれがデータフレームを使用してpythonで行われる必要があります。

答えて

3

これはそれを行う必要があります。

df.sort_values(by=['Denomination', 'A', 'B', 'C', 'D'], 
       ascending=[True, False, False, False, False]) 
Out: 
    Denomination A B C D 
0   100 5 0 0 0 
2   100 0 2 0 0 
1   100 0 0 1 0 
6   200 10 0 0 0 
3   200 5 2 0 0 
4   200 5 0 1 0 
5   200 0 4 0 0 
7   200 0 2 1 0 
8   200 0 0 2 0 

ソートをDenominationの昇順で、ネクタイの場合は、Aで降順にソートされます。ネクタイの場合は、Bで降順でソートされます。

金種列がソートされるべきではなく、グループのためappearenceのために残されるべき場合、あなたはこのような何かを行うことができます。

df.groupby('Denomination')['Denomination'].transform(pd.Series.first_valid_index) 
Out: 
0 0 
1 0 
2 0 
3 3 
4 3 
5 3 
6 3 
7 3 
8 3 
Name: Denomination, dtype: int64 

これは、グループを追跡するために新しい列を返します。 。この列をDataFrameに追加することができます。この列は最高の優先順位を持つことができます。

(df.assign(denomination_group = 
    df.groupby('Denomination')['Denomination'].transform(pd.Series.first_valid_index)) 
    .sort_values(by=['denomination_group', 'A', 'B', 'C', 'D'], 
       ascending=[True, False, False, False, False]) 
    .drop('denomination_group', axis=1)) 
関連する問題