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

Pandas function that iterates over values in a series with case statements

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

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)

不要使用 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 没有 axis=1 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

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