下面有一个示例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,)一起广播
任何帮助将不胜感激!
答案 0 :(得分:0)
如果Temp
是标量,则第一步需要在set_index
的Temperature
列中创建索引。
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