在进行pandas合并时删除重复列

时间:2017-01-11 08:43:33

标签: python pandas

我在pandas df中有一张桌子

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

我在数据帧df2

中还有另一个表
product    price
100         5
200         10
300         15
400         20
500         25
600         30
700         35

我想将df2df1合并,以便将price_x和price_y作为列

然后再次divide price_y/price_x将最终列设为perc_diff

所以我尝试使用。

进行合并
# 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

但是当我合并时,我得到了多列product_1product_2

例如。合并后我的df3.head(1)是:

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

那么如何删除product_1&的这些多列?合并时或合并后product_2

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

要删除列,必须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