2016-07-04 8 views
1

Angenommen, ich habe zwei Datenrahmen:subtrahieren Pandas Datenrahmen während verlassen einige Spalten intakt

data1 = """ 
idx, stat, val 
1, 1, 5 
2, 1, 10 
3, 2, 15 
4, 3, 20 
""" 
data2 = """ 
idx, stat, val 
2, 1, 8 
4, 5, 16 
""" 

(leider - ich weiß nicht, wie dies in Pandas leicht zu codieren - ich würde sie in von csv im wirklichen Leben lesen).

Ich möchte diese beiden Datenfelder subtrahieren, so dass nur die val-Spalte subtrahiert wird (in der Realität sind dies Stationskoordinaten). Das Ergebnis sollte NaN sein, wenn nur einer der beiden Datenfelder den jeweiligen Indexwert hat (Spalte idx im ASCII-Format). Auch ok, wenn nicht übereinstimmende Zeilen sofort entfernt werden (ich würde sowieso danach dropna aufrufen).

Daher wäre mein gewünschtes Ergebnis sein:

desired = """ 
idx, stat, val 
1, 1, NaN 
2, 1, 2 
3, 2, NaN 
4, 3, 4 
""" 

Grundsätzlich data1.sub(data2) funktioniert gut - außer dass ich nicht einen Weg sehen kann, wie die Statistikspalte aus der Subtraktion zu „schützen“. Ich habe auch versucht data1.sub(data2['val'], axis=0), aber dies vermasselt die Zeilenabgleichung, die automatisch in data1.sub(data2) durchgeführt wird. Eine Umgehungslösung besteht darin, die stat-Spalte (n) nachträglich durch die ursprünglichen Werte von data1 zu ersetzen, was jedoch ziemlich plump erscheint.

Antwort

1

können Sie verwenden:

df1.set_index(['idx','stat'], inplace=True) 
df2.set_index('idx', inplace=True) 

print (df1.sub(df2[['val']])) 
      val 
idx stat  
1 1  NaN 
2 1  2.0 
3 2  NaN 
4 3  4.0 

print (df1.sub(df2[['val']]).reset_index()) 
    idx stat val 
0 1  1 NaN 
1 2  1 2.0 
2 3  2 NaN 
3 4  3 4.0 

Wenn idx sind Indizes in beiden df:

print (df1) 
    stat val 
idx   
1  1 5 
2  1 10 
3  2 15 
4  3 20 

print (df2) 
    stat val 
idx   
2  1 8 
4  5 16 

df1.set_index('stat', append=True, inplace=True) 
print (df1.sub(df2[['val']]).reset_index()) 
    idx stat val 
0 1  1 NaN 
1 2  1 2.0 
2 3  2 NaN 
3 4  3 4.0 
Verwandte Themen