2016-05-24 11 views
1

Ich habe einen Datenrahmen in PandasSortierung Werte in einer Spalte, die nationalen Agenturen durch die Reihenfolge der anderen Spalte enthält

import pandas as pd 

df=pd.DataFrame.from_dict({'col1':['A_2','A_1','A_3','A_4','A_6','A_5','A_8','A_7'], 
'col2':['NaN','A_2','A_3','A_4','A_5','NaN','A_1','A_6']}, orient='index').T 

Ich möchte die Reihenfolge der zweiten Spalte ändern, col2 und ändern Sie die Elemente so, die sind das gleiche in beiden Spalten zusammenpassen wie folgt aus:

 col1  col2 
    0 A_2  A_2 
    1 A_1  A_1 
    2 A_3  A_3 
    3 A_4  A_4 
    4 A_6  A_6 
    5 A_5  A_5 
    6 A_7  NaN 
    7 A_8  NaN 

Versuch: df.iloc[:,1].sort_values(df.iloc[:,0]) gibt nur eine Fehlermeldung über unhashable Serie

Es wird nun angenommen, dass th ere sind zwei Datenrahmen:

df1:

df1=pd.DataFrame({'col1':['A_2','A_1','A_3','A_4','A_6','A_5','A_8','A_7'], 
'col2':[0,1,1,0,0,1,1,0], 'col3':[1,6,7,5,4,3,9,8]}) 

df2=pd.DataFrame({'N1':['NaN','A_2','A_3','A_4','A_5','NaN','A_1','A_6'], 
      'N2':['NaN',0,1,2,3,'NaN',0,1], 'N3':['NaN',0,0,0,0,'NaN',0,0]}) 

Und ich möchte, wie oben sortieren, aber dieses Mal sind alle Spalten und Zeilen in df2:

Ausgang:

N1 N2 N3 
A_2 0  0 
A_1 0  0 
A_3 1  0 
A_4 2  0 
A_6 1  0 
A_5 3  0 
NaN NaN NaN 
NaN NaN NaN 

Antwort

2

Wenn Ich verstehe richtig, Sie können col2 mit Werten von col1 umschreiben, wenn sie in col2:

existieren
df.col2 = df.col1[df.col1.isin(df.col2)] 

Ergebnis:

df 
Out[13]: 
    col2 col1 
0 A_2 A_2 
1 A_1 A_1 
2 A_3 A_3 
3 A_4 A_4 
4 A_6 A_6 
5 A_5 A_5 
6 NaN A_8 
7 NaN A_7 

bearbeiten: expandiertes Frage mit zwei Datenrahmen

Dies geht implizit davon aus, dass die Werte in df2.N1 eindeutig sind (mit Ausnahme von NaN Werte). Wir können sie daher als einen Index verwenden, um die entsprechenden Werte von N2 und N3 zu erhalten. Wir können dann df1.col1 als Indexwerte verwenden:

In[53] : df2.set_index('N1', drop=False).loc[df1.col1] 
Out[53]: 
     N1 N2 N3 
N1     
A_2 A_2 0 0 
A_1 A_1 0 0 
A_3 A_3 1 0 
A_4 A_4 2 0 
A_6 A_6 1 0 
A_5 A_5 3 0 
A_8 NaN NaN NaN 
A_7 NaN NaN NaN 

Sie immer .reset_index(drop=True) hinzufügen können, um den Index zu setzen.

+0

Gibt es eine Möglichkeit, dies zu verallgemeinern, um einen ganzen Datenrahmen durch eine Spalte in einem anderen Datenrahmen zu sortieren? – atomsmasher

+0

Geben Sie mir ein Beispiel (zum Beispiel, indem Sie es zu Ihrer ursprünglichen Frage hinzufügen) und ich gebe Ihnen eine Antwort :) – IanS

+0

Ich habe es aktualisiert, danke! :) – atomsmasher

Verwandte Themen