2016-08-02 6 views
4

Ich habe zwei (hunderte) dfs, die erzeugt und dann verkettet werden, die ich dann sortieren möchte, während die Zeilen mit identischen Spalten D in der ursprünglichen Reihenfolge erhalten bleiben :Sortierung nach den Werten einer Spalte, wobei die Zeilen nach dem Wert einer anderen Spalte gruppiert werden

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 

Standardsortierung erzeugt:

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 

Allerdings würde Ich mag auf A sortieren und die Zeilengruppierungen zu halten, wie durch D angegeben. Dies ist die gewünschte Ausgabe:

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 

Muss ich mit groupby arbeiten müssen, oder gibt es eine andere Sortierung/Gruppierung Technik, die ich mit unbekannten bin?

+0

Ist die absolute Reihenfolge der "D" wichtig oder wäre es akzeptabel, wenn die Reihenfolge alphabetisch war? – Grr

+0

Die 5 Zeilen, die jedem 'D' zugeordnet sind, sollten in der gleichen Reihenfolge gehalten werden, wie der Index für jedes' D' anzeigt. – AGS

+0

Meine Schuld, ich war nicht klar. Ist die Reihenfolge jeder 5-Zeilen-Gruppierung in 'D' wichtig? Zum Beispiel wäre es akzeptabel, wenn die Gruppe von MA0835 vor der Gruppe von MA1002 käme? – Grr

Antwort

2

Verwenden Sie das keys Argument in 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

Das bringt mich näher. Ich war nicht klar genug, obwohl - am Ende ist die Reihenfolge von jedem 'Block' von D keine Rolle, solange das ganze df auf dem 'A' Wert an jedem Index 0 – AGS

+0

@AGS Antwort wurde sortiert worden aktualisiert – piRSquared

+0

Die neue Antwort funktioniert gut - außer wenn identische Werte in 'df.A.iloc [0]' vorhanden sind. 'InvalidIndexError: Reindexing nur gültig mit eindeutig bewerteten Index-Objekten' – AGS