2016-09-09 4 views
3

Ich verwende Pandas, um Tabelle zu verarbeiten.Hinzufügen von Attribut aus der anderen Tabelle mit Pandas

[table1] 
    sample1 sample2 sample3 
A 11  22  33 
B 1  2  3 

[table2] 
    sample3 sample4 sample2 
D 333  444  222 

[Result] 
    sample1 sample2 sample3 
A 11  22  33 
B 1  2  3 
D NaN  222  333 

Ich habe zwei Tabellen, und ich mag Zeile hinzuzufügen D (von Tabelle 2) Tabelle 1, die Spaltennamen berücksichtigen. Wenn die Spalte in Tabelle 1 in Tabelle 2 vorhanden ist, wird der entsprechende Wert wie Beispiel 2 und Beispiel 3 zu Tabelle 1 hinzugefügt. Wenn die Spalte in Tabelle nicht wie Beispiel 1 in Tabelle 2 vorhanden ist, wird der Wert von D festgelegt zu NaN oder ignoriert.

Gibt es einen einfachen Weg, dies mit Pandas zu tun?

Antwort

3

Ich glaube, Sie concat verwenden können und dann Spalte entfernen sample4 von drop:

print (pd.concat([table1, table2]).drop('sample4', axis=1)) 
    sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
D  NaN  222  333 

Sie intersection für Auswählen von Spalten in beiden DataFrames verwenden können und dann concat Teilmenge von table2 von diesen Spalten:

print (table2.columns.intersection(table1.columns)) 
Index(['sample2', 'sample3'], dtype='object') 

print (pd.concat([table1,table2[table2.columns.intersection(table1.columns)]])) 
    sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
D  NaN  222  333 

Dann, wenn nötig Zeilen mit NaN entfernen, verwenden Sie dropna:

print (pd.concat([table1, table2]).drop('sample4', axis=1).dropna()) 
    sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
+0

Ich dachte, dass ich Werte in Spalten nachschlagen müssen, aber concat ist einfacher und sehr intuitiv. Vielen Dank für Ihre Antwort. – z991

+0

Froh kann dir helfen! – jezrael

3

Sie können jezrael die answer von ersten Teilauswahl Spalten von table2, die in table1 verallgemeinern. Dies ist ziemlich sauber mit numpy.in1d getan. Dies vermeidet auch die Bildung eines potentiell riesigen temporären Datenrahmens mit Spalten von beiden Datenrahmen. Beispiel:

import numpy as np 
import pandas as pd 

table1 = pd.DataFrame([[11, 22, 33], [1, 2, 3]], index=list('AB'), columns=['sample1', 'sample2', 'sample3']) 
table2 = pd.DataFrame([[333, 444, 222]], index=['D'], columns=['sample3', 'sample4', 'sample2']) 

# Sub-select columns... 
cols_in_table1 = table2.columns[np.in1d(table2.columns, table1.columns)] 

# ... and concatenate. 
results = pd.concat((table1, table2[cols_in_table1])) 

print(results) 

Welche druckt:

sample1 sample2 sample3 
A  11.0  22  33 
B  1.0  2  3 
D  NaN  222  333 
+0

Es wäre sehr nützlich für die Unterspaltenauswahl. Vielen Dank für Ihren Kommentar zur in1d-Funktion. – z991

Verwandte Themen