使用底行中的多个值创建减去的数据框

时间:2018-06-20 05:18:48

标签: python pandas dataframe

下面有一个示例df1 ...我需要通过从列的其余部分减去每列底部的值来创建新的df_sub

df_sub = i(每列中的每个值)-(a_squared * Temp + b * Temp + c)**

示例df1.head()

Temperature    A1     A2      A3      A4
  25.0      681.51  147.40  409.26  680.83
  25.2      615.89  124.34  362.39  618.37
  25.4      568.72   95.22  310.37  567.22
  25.6      522.08   89.74  272.69  516.53
  25.8      480.04   68.20  229.03  477.30

示例df1.tail()

Temperature    A1     A2       A3        A4
  95.0     -102.14  6348.77  2276.56  -2545.60
    a        15.26    10.67    -1.87     13.25  
    b     -1016.94  -623.29    29.40   -902.77
    c     16557.63  9044.62   715.07  14941.87
a_squared   232.95   113.95     3.53    175.65

这是我尝试过的,并且得到的错误...

df_sub = df1.iloc[:-4] - (Temp * df1.iloc[-1, :] + (Temp * df1.iloc[-3, :]) + df1.iloc[-2, :])  

温度是类似np.arange(25, 95.2, 0.2)

的列表

ValueError:操作数不能与形状(96,)(351,)一起广播

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果Temp是标量,则第一步需要在set_indexTemperature列中创建索引。

df1 = df1.set_index('Temperature')
print (df1)
                   A1       A2       A3        A4
Temperature                                      
25.0           681.51   147.40   409.26    680.83
25.2           615.89   124.34   362.39    618.37
25.4           568.72    95.22   310.37    567.22
25.6           522.08    89.74   272.69    516.53
25.8           480.04    68.20   229.03    477.30
95.0          -102.14  6348.77  2276.56  -2545.60
a               15.26    10.67    -1.87     13.25
b            -1016.94  -623.29    29.40   -902.77
c            16557.63  9044.62   715.07  14941.87
a_squared      232.95   113.95     3.53    175.65

然后使用broadcasting将多个索引值转换为numpy数组:

idx = df1.index
#if necessary convert index to numeric
#idx = pd.to_numeric(df1.index, errors='coerce')
a = df1.iloc[-1].values * idx[:-4].values[:, None]
b = df1.iloc[-3].values * idx[:-4].values[:, None]
df_sub = df1.iloc[:-4] - (a + b + df1.iloc[-2].values)
print (df_sub)
                    A1         A2        A3         A4
Temperature                                           
25.0          3723.630   3836.280 -1129.060   3916.960
25.2          3814.808   3915.088 -1182.516   3999.924
25.4          3924.436   3987.836 -1241.122   4094.198
25.6          4034.594   4084.224 -1285.388   4188.932
25.8          4149.352   4164.552 -1335.634   4295.126
95.0         57819.280  45691.450 -1566.860  51588.930