【问题标题】:pandas apply function over columns of dataframe with if/truth statementspandas 使用 if/truth 语句对数据框列应用函数
【发布时间】:2016-11-22 17:12:37
【问题描述】:

我在 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'])

感谢您的帮助

【问题讨论】:

    标签: python pandas lambda


    【解决方案1】:

    您可以使用 (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
    

    之所以有效,是因为元组是逐个元素比较的,并且月/日是自然排序的。任何真正的条件都会计算出有效的 1 和错误的条件 0 - 如果需要,我们会将其添加到年份以将其移至下一个。

    【讨论】:

    • 这很有效,教会了我一些关于元组的有价值的东西
    • @JeffTilton 哦 - 可能想要> 而不是>= 但你可能已经注意到了:)
    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2019-10-15
    • 2021-02-03
    • 2011-09-24
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多