pandas合并以从数据框中引入两列并对列

时间:2017-01-10 12:57:04

标签: python pandas

我在pandas dataframe df中有一个表

Leafid  pidx  pidy  value
  100     1     3      10
  100     2     6      12
  200     5     7      48
  300     7     1      11

我有另一个数据帧df2

pid  price
1      10
2      20
3      30
4      40
5      50
6      60
7      70

我想合并df和df2,这样我还有两个列price_pidx and price_pidy

然后也进行price_pidy/price_pidx

的划分

例如:

Leafid pidx pidy value price_pidx price_pidy price_pidy/price_pidx

 `100    1      3     10            10           30             3`

我的最终df应该有列

pidx   pidy   value   price_pidx/price_pidy

我不想在此使用.map()。 有什么方法可以使用pd.merge吗?

我知道怎么带一列price_pidx但如何带两个?

例如。

pd.merge(df,df2['pid','price'],how = left, left_on = 'pidx' right_on = 'pid')

但是如何同时带来price_pidx和price_pidy

1 个答案:

答案 0 :(得分:1)

没有map这很复杂,因为需要按melt,然后merge和最后unstack重新塑造:

df = pd.melt(df, id_vars='value', value_name='pid', var_name='g')
df2 = pd.merge(df,df2[['pid','price']], how='left', on = 'pid')
df2 = df2.set_index(['value','g']).unstack()
df2.columns = ['_'.join(col) for col in df2.columns]
df2['col'] = df2.price_pidy / df2.price_pidx
df2 = df2.rename(columns={'pid_pidx':'pidx','pid_pidy':'pidy'})
print (df2)
       pidx  pidy  price_pidx  price_pidy       col
value                                              
10        1     3          10          30  3.000000
11        7     1          70          10  0.142857
12        2     6          20          60  3.000000
48        5     7          50          70  1.400000