【问题标题】:create subtracted dataframe using multiple values from the bottom rows使用底部行中的多个值创建减去的数据框
【发布时间】:2018-07-11 13:52:56
【问题描述】:

我在下面有一个示例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, :])  

Temp 是一个类似的列表:np.arange(25, 95.2, 0.2)

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

任何帮助将不胜感激!

【问题讨论】:

  • A1 到 A4 列是什么意思?这些是测量值吗?这是您正在建模的物理现象吗?
  • @heltonbiker 它们是温度加热实验的测量值……实际上有更多的列和行。
  • 所以你的问题的第一项似乎很奇怪。如果要计算np.polyfit(x, y, 2),则需要x 值和y 值。但是您提到“每列的第 0、1、2 行”,这将给出三个序列,而不是两个。那么x从哪里来,y从哪里来?
  • 现在有什么想法@heltonbiker?
  • 对不起,我仍然觉得这很混乱。具体来说,对每个温度值应用不同回归的想法似乎没有意义。假设你得到这个工作,你希望如何使用找到的公式?推断温度值?或者在给定温度值的情况下推断传感器读数?我认为通过更好地理解来分析您的困难会容易得多。

标签: python pandas dataframe


【解决方案1】:

如果Temp 是一些标量,则需要在Temperature 列中创建索引,由set_index 作为第一步:

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

【讨论】:

  • Temp 是温度列(索引)而不是标量,我只是想显示它以 0.2 步从 25-95 变化。所以有 351 行。
  • @Schnick - 请立即检查解决方案。
  • 只需从 `idx[:-4].values[:, None] 的两个实例中删除 '-4' 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多