将df中的许多列减去另一个df中的一列

时间:2017-07-28 22:16:55

标签: python pandas

我试图减去df" stock_returns" (144行x 517 col)由df" p_df" (144行x 1 col)。

我试过了;

stock_returns - p_df

stock_returns.rsub(p_df,axis=1)
stock_returns.substract(p_df)

但是它们都不起作用并且都返回了Nan值。

我通过这个fnc传递它,并使用for循环来获取args:

def disp_calc(returns, p, wi):    #apply(disp_calc, rows = ...)
    wi = wi/np.sum(wi)
    rp = (col_len(returns)*(returns-p)**2).sum()      #returns - p causing problems    
    return np.sqrt(rp)

for i in sectors:
    stock_returns = returns_rolling[sectordict[i]]#.apply(np.mean,axis=1)          
    portfolio_return = returns_rolling[i]; p_df = portfolio_return.to_frame()
    disp_df[i] = stock_returns.apply(disp_calc,args=(portfolio_return,wi))

我的预期输出是将第一个df中的所有517个cols减去p_df中的1个col。所以最终的结果仍然会有517个cols。感谢

2 个答案:

答案 0 :(得分:3)

你几乎就在那里,只需要设置axis=0来减去索引:

>>> stock_returns = pd.DataFrame([[10,100,200], 
                             [15, 115, 215], 
                             [20,120, 220], 
                             [25,125,225], 
                             [30,130,230]], columns=['A', 'B', 'C']) 
>>> stock_returns

   A    B    C
0  10  100  200
1  15  115  215
2  20  120  220
3  25  125  225
4  30  130  230

>>> p_df = pd.DataFrame([1,2,3,4,5], columns=['P'])
>>> p_df

   P
0  1
1  2
2  3
3  4
4  5

>>> stock_returns.sub(p_df['P'], axis=0)

    A    B    C
0   9   99  199
1  13  113  213
2  17  117  217
3  21  121  221
4  25  125  225

答案 1 :(得分:0)

data ['new_col3'] =数据['col1']-数据['col2']