2017-06-09 4 views
2

Ich versuche, Zeilen eines Datenrahmens durch die gleiche Indexzeile in einem anderen Datenrahmen zu teilen. Es gibt die gleiche Anzahl von Spalten in jedem Datenrahmen.Teilen Sie einen Datenrahmen durch einen anderen Datenrahmen gemäß Index

Ziel ist es, eine Liste von Spalten durch eine andere Liste von Spalten zu teilen. Gibt es eine Möglichkeit, dies in Pandas zu tun?

Hier ist ein Beispieldaten:

import pandas as pd 
import numpy as np 
data1 = {"a":[10.,20.,30.,40.,50.], 
     "b":[900.,800.,700.,600.,500.], 
     "c":[2.,4.,6.,8.,10.]} 
data2 = {"f":[1.,2.,3.,4.], 
     "g":[900.,800.,700.,600.], 
     "h":[10.,20.,30.,40.]} 
df1 = pd.DataFrame(data1) 
df2 = pd.DataFrame(data2) 

Erwartete Ausgabe:

a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
4 NaN NaN NaN 

Ab jetzt habe ich diese kleine Funktion verwende ich schrieb:

def divDF(df1, df2): 
    nRow, nCol = df1.shape 
    result = pd.DataFrame(np.empty((nRow, nCol)), index=df1.index) 
    for col in range(nCol): 
     result.iloc[:,col] = df1.iloc[:,col]/df2.iloc[:,col] 
    return result 

Ist das der Nur so oder gibt es einen schnelleren Weg?

Antwort

2

Pandas macht eine intrinsische Datenausrichtung. Wenn Sie also Ihren Zeilenindex und die Spalte in beiden Datenfomen gleich markieren, führt Pandas die Operation wie erwartet aus.

Sie benötigen Spalten zu einem gemeinsamen Namen mit Wörterbuch-Mapping alten Spaltennamen neuen Namen umbenennen wie folgt:

rn_df1 = dict(list(zip(df1.columns.values,(df1.columns+'/'+df2.columns)))) 
rn_df2 = dict(list(zip(df2.columns.values,(df1.columns+'/'+df2.columns)))) 
df1.rename(columns=rn_df1).div(df2.rename(columns=rn_df2)) 

Ausgang:

a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
3

dividieren durch Werte um Index Ausrichtung zu erhalten

dfd = df1.div(df2.values) 
dfd.columns = df1.columns + '/' + df2.columns 

dfd 

    a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 

Oder

c = df1.columns + '/' + df2.columns 
pd.DataFrame(df1.values/df2.values, df1.index, c) 

    a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 

Wiedergeburt @ ScottBoston Antwort

c = df1.columns + '/' + df2.columns 
d1 = dict(zip(df1.columns, c)) 
d2 = dict(zip(df2.columns, c)) 
df1.rename(columns=d1)/df2.rename(columns=d2) 

    a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
4 NaN NaN NaN 
+1

Manchmal habe ich einfach überdenken einige Lösungen. Schön piRSquared. –

+0

@ScottBoston glauben Sie mir ... so .. tun .. ich! – piRSquared

+0

Die Beispieldaten wurden aktualisiert. Funktioniert das mit unterschiedlichen Indizes? – Oligg

3

align Mit Index Ausrichtung zu erzwingen:

df3 = np.divide(*df1.align(df2, axis=0)) 
df3.columns = df1.columns + '/' + df2.columns 

Die resultierende Ausgabe:

a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
4 NaN NaN NaN 
+0

Das ist wirklich intelligente Verwendung von 'align' – piRSquared

+0

Diese Methode scheint langsamer auf einem größeren Dataframe (getestet mit 20k Zeilen, 1k Spalten), aber schneller auf kleinen Datenrahmen – Oligg

Verwandte Themen