我有一个包含整数列的数据框。我想编写一个函数,它将一系列作为参数,遍历系列的每个值,并对系列中的每个整数执行一个case语句,并从case语句的结果中返回一个新的系列。目前我正在使用以下代码并收到错误:
java.lang
答案 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
但实际上你应该使用像我上面提议的矢量化方法