2017-08-03 2 views
1

Dies ist eine kleine Übung in Kombinationen und Pandas.Füllen eines Pandas-Datenrahmens mit Werten aus einem anderen Datenrahmen (Kombinationen)

Ich habe derzeit einen Pandas Datenrahmen wie:

| Knoten1 | Knoten2 | Entfernung |
| Sydney | Canberra | 100 |
| Melbourne | Sydney 200 |
| Canberra | Melbourne | 150 |

Ich erstellen dann einen neuen Datenrahmen, so dass Spaltenüberschriften und Zeilennamen die eindeutigen Werte der Knoten sind.

mat = pd.DataFrame(index = np.unique(df.node1), columns = np.unique(df.node1)) 

Entweder node1 oder node2 würde hier genügen, da die Reihenfolge beim Erstellen des Datenrahmens keine Rolle spielt.

Was produziert, was ich will aber gefüllt mit NaN-Werten.

Wie gehe ich zum Füllen der Matte mit den Werten aus der Distanzspalte, ohne eine hässliche Schleife zu schreiben?

Dank

+0

Sind Spalten und Index von 'node1' erstellt? – jezrael

+0

können Sie den Combos Dataframe hinzufügen? – Dark

Antwort

1

Erster Einsatz pivot oder set_index mit unstack:

mat = df.pivot(index='node1', columns='node2', values='distance') 
print (mat) 
node2  Canberra Melbourne Sydney 
node1         
Canberra  NaN  150.0  NaN 
Melbourne  NaN  NaN 200.0 
Sydney  100.0  NaN  NaN 

mat = df.set_index(['node1', 'node2'])['distance'].unstack() 
print (mat) 
node2  Canberra Melbourne Sydney 
node1         
Canberra  NaN  150.0  NaN 
Melbourne  NaN  NaN 200.0 
Sydney  100.0  NaN  NaN 

Und dann combine_first mit T:

mat = mat.combine_first(mat.T) 
print (mat) 
      Canberra Melbourne Sydney 
node1         
Canberra  NaN  150.0 100.0 
Melbourne  150.0  NaN 200.0 
Sydney  100.0  200.0  NaN 
+0

Danke @jezrael Ich habe über Pivot vergessen. Zusätzliche Frage, gibt es eine Möglichkeit, die Rückseite auch z. Sydney -> Canberra = 100 großartig! aber bevölkern auch Canberra -> Sydney = 100? – mike

+0

In der Tat, wenn ich mat2 = df.pivot (index = 'node2', columns = 'node1', values ​​= 'distance') mache ich das Gegenteil. Jetzt brauche ich eine Möglichkeit, diese beiden Datenrahmen zusammenzuführen. – mike

+1

Ja, oder benutzen Sie 'df1.combine_first (df2' – jezrael

Verwandte Themen