我有一个 pandas 数据框,其中包含日期、最低温度和最高温度列。我想遍历数据框,对于每一天,如果最高温度 >86,首先确定平均温度(使用最小值和最大值);否则,我希望它做一些其他事情来计算平均值。然后,使用通过第一个函数获得的平均值,我想运行另一个函数并将该函数的输出收集到一个数组中。我遇到了一个错误,“一个系列的真值”是模棱两可的。
这是我到目前为止编写的代码:
#Function defining how to obtain the mean based on max temp
def MeanTemp(T_min, T_max):
if T_max < 86:
mean = np.mean(T_max, T_min)
else:
mean = np.mean(86, T_min)
return mean
#Function that will use the mean from the MeanTemp function
def GrowingDegreeDays(mean,base):
if mean > base:
GDD = mean-base
else:
GDD = 0
#For each row in my dataframe, I want it to perform these two functions
for Date in df:
mean = MeanTemp(T_min, T_max)
GrowingDegreeDays(mean,50)
当我运行它时,出现错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
由于行if T_max < 86:
而抛出此错误;从一些研究来看,我认为这是因为它试图在整个列上运行该功能?我如何让它只查看特定行的值?还是发生了其他事情?我是一个非常新的编码员,所以我很欣赏使用更简单语言的用户;)
感谢您的帮助!
你的错误是对的。此外,尝试使用矢量化代码以提高效率:
mean = df['T_max'].clip(upper=86).add(df['T_min']).div(2)
gdd = mean.sub(50).clip(lower=0)
clip
可以避免你的条件语句。
输出:
>>> mean
0 52.5
1 49.0
2 49.5
3 51.0
4 51.0
5 49.5
6 56.5
7 54.5
8 49.5
9 56.5
dtype: float64
>>> gdd
0 2.5
1 0.0
2 0.0
3 1.0
4 1.0
5 0.0
6 6.5
7 4.5
8 0.0
9 6.5
dtype: float64
import pandas as pd
import numpy as np
N = 10
rng = np.random.default_rng(2023)
df = pd.DataFrame({'Date': pd.date_range('2023-04-01', periods=N, freq='D'),
'T_min': rng.integers(10, 40, N),
'T_max': rng.integers(80, 100, N)})