gpt4 book ai didi

python - pandas 使用 if/truth 语句在数据框的列上应用函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:33 27 4
gpt4 key购买 nike

我在 Pandas 数据框中有三列。

df = pd.DataFrame({'month':[1,2,3,4,5,6,7,8,9,10,11,12],
'day':[10,23,16,30,1,23,3,28,29,1,4,2],
'year':[1990,1990,1990,1990,1990,1990,1990,1990,1990,1990,1990,1990]})

我想在另一列中返回水年,该列定义为 9 月 28 日之后的任何一天的年份 +1。例如,1990 年 9 月 29 日是 1991 年水年。

我有一个独立工作的函数

def wy(month, day, year):
if month >8 and day > 28:
year = year + 1
else:
if month>9:
year = year + 1
else:
year = year
return year
wy(9,30,2000)

但是

df['wy'] = wy(df['month'],df['day'],df['year'])

返回错误

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

当我尝试将它应用于数据框时。我查看了文档和其他问题,并尝试了多种其他功能,例如

def wy(month, day, year):
if any(month >8 & day > 28):
year = year + 1
else:
if any(month>9):
year = year + 1
else:
year = year
return year


def wy(month, day, year):
if any((month >8 & day > 28)|month>9):
year = year + 1
return year

但我仍然返回错误。我也尝试过 lambda 表达式(不是很漂亮)

df['wy'] = (lambda x,y,z:z+1 if (x >8 & y > 28)|y>9 else z, df['month'],df['day'],df['year'])

感谢您的帮助

最佳答案

您可以使用 (month, day) 的元组并与应用在列轴上的元组进行比较,例如:

df = pd.DataFrame({'month':[1,2,3,4,5,6,7,8,9,10,11,12],
'day':[10,23,16,30,1,23,3,28,29,1,4,2],
'year':[1990,1990,1990,1990,1990,1990,1990,1990,1990,1990,1990,1990]})

使用:

df.apply(lambda L: L.year + ((L.month, L.day) >= (9, 28)), axis=1)

给你:

0     1990
1 1990
2 1990
3 1990
4 1990
5 1990
6 1990
7 1990
8 1991
9 1991
10 1991
11 1991
dtype: int64

这是有效的,因为元组是逐个元素比较的,月/日是自然排序的。任何 true 条件的计算结果为 1,false 条件的计算结果为 0 - 如果需要,我们将其添加到年份以将其移至下一年。

关于python - pandas 使用 if/truth 语句在数据框的列上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com