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

时间:2015-04-26 20:08:49

标签: function pandas case series

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

java.lang

1 个答案:

答案 0 :(得分: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,系列的axis=1方法没有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

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