首页 文章

Pandas函数使用case语句迭代一系列中的值

提问于
浏览
1

我有一个包含整数列的数据框 . 我想编写一个函数,它将一系列作为参数,遍历系列的每个值,并对系列中的每个整数执行一个case语句,并从case语句的结果中返回一个新的系列 . 目前我正在使用以下代码并获取错误:

def function(series):
    if series['column_of_ints'] >= 0 and series['column_of_ints'] < 100:
        return series['column_of_ints']
    elif series['column_of_ints'] >= 100 and series['column_of_ints'] < 200:
        return series['column_of_ints'] + 1   
    else:
        return series['column_of_ints'] + 2

df['column_of_ints_v2'] = df['column_of_ints'].apply(function, axis=1)

1 回答

  • 1

    不要使用 apply 使用3 .loc 调用可以更快地实现相同的结果:

    df.loc[(df['column_of_ints'] >= 0) & (df['column_of_ints'] < 100), 'column_of_ints_v2'] df['column_of_ints']
    
    df.loc[(df['column_of_ints'] >= 100) & (df['column_of_ints'] < 200), 'column_of_ints_v2'] = df['column_of_ints'] + 1   
    
    df.loc[(df['column_of_ints'] < 0) & (df['column_of_ints'] >= 200), 'column_of_ints_v2'] = df['column_of_ints'] + 2
    

    或使用 where

    df['column_of_ints_v2'] = np.where((df['column_of_ints'] >= 0) & (df['column_of_ints') < 100), df['column_of_ints'] + 1, np.where( (df['column_of_ints'] >= 100) & (df['column_of_ints'] < 200), df['column_of_ints'] + 2, df['column_of_ints'] ))
    

    至于你的代码失败的原因:

    df['column_of_ints'].apply(function, axis=1)
    

    df ['column_of_ints']是一个Series而不是DataFrame,对于Series没有 apply for apply 方法,你可以使用双方括号将其强制为DataFrame:

    df[['column_of_ints']].apply(function, axis=1)
    

    如果您逐行应用于单个列,则不需要函数中的列访问器:

    def function(series):
        if series >= 0 and series < 100:
            return series
        elif series >= 100 and series < 200:
            return series + 1   
        else:
            return series + 2
    

    但实际上你应该像我上面提出的那样使用矢量化方法

相关问题