如何在 pandas 中的计算中实现对所有列的循环?

How to implement a loop over all columns within a calculation in pandas?

我是 pandas 和 python 的新手,我正在为在我的代码中实现循环而苦苦挣扎。我希望有人能帮助我。

我有以下数据框:

import pandas as pd
from pandas import Timestamp

pd.DataFrame({'DateTime': {0: Timestamp('2021-06-13 00:00:00'),
  1: Timestamp('2021-06-13 02:00:00'),
  2: Timestamp('2021-06-13 05:00:00'),
  3: Timestamp('2021-06-13 07:00:00'),
  4: Timestamp('2021-06-13 10:00:00')},
 'actual_value': {0: 180.0949105082311,
  1: 183.93185469787613,
  2: 191.48399886639095,
  3: 188.31358023933768,
  4: 159.32768035801615},
 'forecast_0': {0: nan,
  1: 185.0,
  2: 206.0,
  3: 193.0,
  4: 130.0},
 'forecast_1': {0: 187.0,
  1: 185.0,
  2: 206.0,
  3: 192.0,
  4: 130.0},
 'forecast_2': {0: 186.0,
  1: nan,
  2: 200.0,
  3: 192.0,
  4: nan},
 'forecast_3': {0: 186.0,
  1: 185.0,
  2: 200.0,
  3: 192.0,
  4: 130.0},
 'forecast_4': {0: 186.0,
  1: 183.0,
  2: 200.0,
  3: 188.0,
  4: 130.0}})

             DateTime  actual_value  forecast_0  forecast_1  forecast_2  \
0 2021-06-13 00:00:00    180.094911         NaN       187.0       186.0   
1 2021-06-13 02:00:00    183.931855       185.0       185.0         NaN   
2 2021-06-13 05:00:00    191.483999       206.0       206.0       200.0   
3 2021-06-13 07:00:00    188.313580       193.0       192.0       192.0   
4 2021-06-13 10:00:00    159.327680       130.0       130.0         NaN   

   forecast_3  forecast_4  
0       186.0       186.0  
1       185.0       183.0  
2       200.0       200.0  
3       192.0       188.0  
4       130.0       130.0  

我想创建一个新的 Dataframe 或用简单的计算替换现有 Dataframe 中的数字。我想确定第二列中所有预测值相对于实际值的偏差。由于有 40 多个这样的预测列,因此记下每一列的计算实在是太费时了。这就是为什么我想实现一个循环。 我尝试了以下代码,但没有用:

for i, col in enumerate(df.columns, -2):
    df[col] = (df[col]-df['actual_value'])/df['actual_value']

我收到错误,'subtract' 不能使用类型为 dtype('

您正在寻找 pd.DataFrame.sub and pd.DataFrame.div:

>>> df.iloc[:, 2:].sub(df["actual_value"], axis=0).div(df["actual_value"], axis=0)
   forecast_0  forecast_1  forecast_2  forecast_3  forecast_4
0         NaN    0.038341    0.032789    0.032789    0.032789
1    0.005807    0.005807         NaN    0.005807   -0.005066
2    0.075808    0.075808    0.044474    0.044474    0.044474
3    0.024886    0.019576    0.019576    0.019576   -0.001665
4   -0.184071   -0.184071         NaN   -0.184071   -0.184071

经验法则:如果您希望使用循环对 DataFrame 进行操作,那您就错了。

你可以使用str.contains选择包含'forecast'的变量,然后应用:

df.loc[:,df.columns.str.contains('forecast')].apply(lambda x: (x-df['actual_value'])/df['actual_value'])
Out[0]: 
   forecast_0  forecast_1  forecast_2  forecast_3  forecast_4
0         NaN    0.038341    0.032789    0.032789    0.032789
1    0.005807    0.005807         NaN    0.005807   -0.005066
2    0.075808    0.075808    0.044474    0.044474    0.044474
3    0.024886    0.019576    0.019576    0.019576   -0.001665
4   -0.184071   -0.184071         NaN   -0.184071   -0.184071

错误 'subtract' cannot use operands with types dtype('

要正确执行此操作,您可以将循环更改为 for col in df.columns[2:]:

尽管我同意此处发布的其他解决方案 - 不使用循环来执行此操作更优雅。