создать вычтенный фрейм данных, используя несколько значений из нижних строк

1

У меня есть пример df1 ниже... Мне нужно создать новый df_sub путем вычитания значений в нижней части каждого столбца из остальной части столбца.

df_sub = я (каждое значение в каждом столбце) - (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,)

Любая помощь будет оценена!

Теги:
pandas
dataframe

1 ответ

0
Лучший ответ

Если 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

И затем несколько значений индекса, преобразованных в массив 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
  • 0
    Temp - это столбец температуры (индекс), а не скаляр, я просто хотел показать, что он идет от 25-95 с шагом 0,2. Итак, есть 351 ряд.
  • 0
    @Schnick - Пожалуйста, проверьте решение сейчас.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню