2016-12-04 4 views
2

Im folgenden Datenfeld, in jeder Zeile, möchte ich name1 Wert zu kleineren Werten zwischen name1 und name2.Reihenfolge der Spaltenwerte in Pandas

data = {'name1': ['Jason', 'Molly', 'Tina', 'yuma', 'Amy'], 
     'name2': ['Cochice', 'Pima', 'Santa', 'Maria', 'Yuma'], 
     'val': [12, 22, 4, 9, 7], 
     'db' : ['xx','yy', 'zz', 'mm', 'aa']} 
df = DataFrame(data) 
df 


db name1 name2 val 
xx Jason Cochice 12 
yy Molly Pima 22 
zz Tina Santa 4 
mm yuma Maria 9 
aa Amy Yuma 7 

Soweit ich weiß, kann die Sortierung nur nach Zeilen erfolgen. So ordnen Sie Werte auf diese Weise?

Die erwartete Ausgabe lautet:

db name1 name2 val 
xx Cochice Jason 12 
yy Molly Pima 22 
zz Santa Tina 4 
mm Amy  Maricopa 9 
aa Amy  Yuma 7 

Antwort

2

Sie apply mit sorted verwenden können, aber zuerst set_index und letzte reset_index:

print (df.set_index('val').apply(sorted, axis=1).reset_index()) 
    val name1 name2 
0 2 Cochice Jason 
1 2 Molly Pima 
2 3 Santa Tina 
3 3  Amy Maria 
4 3  Amy Yuma 

ähnliche Lösung mit np.sort:

print (df.set_index('val').apply(np.sort, axis=1).reset_index()) 
    val name1 name2 
0 2 Cochice Jason 
1 2 Molly Pima 
2 3 Santa Tina 
3 3  Amy Maria 
4 3  Amy Yuma 

Wenn mehrere Spalte umns verwenden subset:

df[['name1','name2']] = df[['name1','name2']].apply(np.sort, axis=1) 
print (df) 
    db name1 name2 val 
0 xx Cochice Jason 2 
1 yy Molly Pima 2 
2 zz Santa Tina 3 
3 mm  Amy Maria 3 
4 aa  Amy Yuma 3 
+0

Funktioniert perfekt, aber ich denke, ich war nicht sehr klar. Ich habe auch andere Spalten. Ich brauche diese Operation nur für 'name1' und' name2', wobei alle anderen Spalten unverändert bleiben. Chaged das OP – learner

+0

Sorry, ich bearbeite Antwort. – jezrael

Verwandte Themen