如何在 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:]:
尽管我同意此处发布的其他解决方案 - 不使用循环来执行此操作更优雅。
我是 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:]: