如何根据两列的值对数据框的每一行执行一个函数?

问题描述 投票:0回答:1

我有一个 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:
而抛出此错误;从一些研究来看,我认为这是因为它试图在整个列上运行该功能?我如何让它只查看特定行的值?还是发生了其他事情?我是一个非常新的编码员,所以我很欣赏使用更简单语言的用户;)

感谢您的帮助!

pandas dataframe valueerror ambiguous
1个回答
0
投票

你的错误是对的。此外,尝试使用矢量化代码以提高效率:

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)})
© www.soinside.com 2019 - 2024. All rights reserved.