2017-01-11 3 views
1
fusionieren

Ich habe eine Tabelle in Pandas dfDoppelte Spalten entfernen, während tun Pandas

id product_1 product_2 count 
1  100  200   10 
2  200  600   20 
3  100  500   30 
4  400  100   40 
5  500  700   50 
6  200  500   60 
7  100  400   70 

ich habe auch eine andere Tabelle in Datenrahmen df2

product price 
100   5 
200   10 
300   15 
400   20 
500   25 
600   30 
700   35 

ich wollte df2 mit df1 so zusammenführen, dass ich bekommen price_x und price_y als Spalten

und dann wieder divide price_y/price_x zu letzten Spalte als perc_diff zu bekommen.

Also habe ich versucht, Merge mit zu tun.

# Add prices for products 1 and 2 
df3 = (df1. 
     merge(df2, left_on='product_1', right_on='product'). 
     merge(df2, left_on='product_2', right_on='product')) 

# Calculate the percent difference 
df3['perc_diff'] = (df3.price_y - df3.price_x)/df3.price_x 

Aber wenn ich habe ich mehrere Spalten von product_1 und product_2

für zB fusionieren bekam. mein df3.head(1) nach Verschmelzung ist:

id product_1 product_2 count product_1 product_2 price_x price_y 
1  100  200   10 100   200   5  10  

Wie entferne ich diese mehrere Spalte von product_1 & product_2 während der Zusammenführung oder nach dem Zusammenführen?

Antwort

4
df2_ = df2.set_index('product') 
df3 = df.join(df2_, on='product_1') \ 
     .join(df2_, on='product_2', lsuffix='_x', rsuffix='_y') 

df3.assign(perc_diff=df3.price_y.div(df3.price_x).sub(1)) 

enter image description here

+0

ist schneller fusionieren oder für eine große Datenmenge (in Gb ist) beitreten – Shubham

+0

ich eine solide Vermutung würde sie über die gleich. – piRSquared

2

Für Spalte Entfernen ist notwendig rename:

df3 = df1.merge(df2, left_on='product_1', right_on='product') \ 
     .merge(df2.rename(columns={'product':'product_2'}), on='product_2') 

#borrow from piRSquared solution 
df3 = df3.assign(perc_diff=df3.price_y.div(df3.price_x).sub(1)) 
print (df3) 
    id product_1 product_2 count product price_x price_y perc_diff 
0 1  100  200  10  100  5  10  1.00 
1 3  100  500  30  100  5  25  4.00 
2 6  200  500  60  200  10  25  1.50 
3 7  100  400  70  100  5  20  3.00 
4 2  200  600  20  200  10  30  2.00 
5 4  400  100  40  400  20  5  -0.75 
6 5  500  700  50  500  25  35  0.40 
Verwandte Themen