2017-08-21 3 views
0

Ich habe zwei DatenrahmenMultiply Datenrahmen mit Werten aus anderen Datenrahmen

df1 = pd.DataFrame([[1,2],[3,4],[5,6],[7,8]], index = ['a','b','c', 'a'], columns = ['d','e']) 
    d e 
a 1 2 
b 3 4 
c 5 6 
a 7 8 


df2 = pd.DataFrame([['a', 10],['b',20],['c',30],['f',40]]) 


    0 1 
0 a 10 
1 b 20 
2 c 30 
3 f 40 

ich meinen letzter Datenrahmen will Reihen von DF1 zu multiplizieren um einen Faktor Wert in df2 entsprechend zu multiplizieren (für z. B. 20 für b)

so sollte meine Ausgabe aussehen

 d e 
a 10 20 
b 60 80 
c 150 180 
a 70 80 

bitte eine Lösung bieten df1 unter der Annahme, Hunderte von Zeilen lang zu sein. Ich konnte nur an df1.index denken.

Antwort

2

Verwenden set_index und reindexdf2 mit df1 auszurichten und dann mul

In [1150]: df1.mul(df2.set_index(0).reindex(df1.index)[1], axis=0) 
Out[1150]: 
    d e 
a 10 20 
b 60 80 
c 150 180 
a 70 80 
0

IIUC:

In [55]: df1 * pd.DataFrame(np.tile(df2[[1]],2), columns=df1.columns, index=df2[0]) 
Out[55]: 
    d e 
a 10 20 
a 70 80 
b 60 80 
c 150 180 

Helper DF:

In [57]: pd.DataFrame(np.tile(df2[[1]],2), columns=df1.columns, index=df2[0]) 
Out[57]: 
    d e 
0 
a 10 10 
b 20 20 
c 30 30 
0

Dies ist gerade nach vorne. Sie nur sicherstellen, dass sie eine gemeinsame Achse haben, dann können Sie sie kombinieren:

legte die Nachschlagespalte in den Index

df2.set_index(0, inplace=True) 

    1 
0 
a 10 
b 20 
c 30 

Jetzt können Sie diese Spalte in df1 setzen sehr leicht:

df1['multiplying_factor'] = df2[1] 

Jetzt wollen Sie nur zwei Spalten multiplizieren:

df1['final_value'] = df1.e*df1.multiplying_factor 

Jetzt df1 sieht aus wie:

d e multiplying_factor final_value 
a 1 2 10     20 
b 3 4 20     80 
c 5 6 30     180 
a 7 8 10     80 
1

erstellen mapping und rufen df.apply:

In [1128]: mapping = dict(df2.values) 

In [1129]: df1.apply(lambda x: x * mapping[x.name], 1) 
Out[1129]: 
    d e 
a 10 20 
b 60 80 
c 150 180 
a 70 80 
Verwandte Themen