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
但实际上你应该使用像我上面的建议那样的矢量化方法
我有一个包含一列整数的数据框。我想编写一个函数,它将系列作为参数,遍历系列的每个值,并对系列中的每个整数执行 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
但实际上你应该使用像我上面的建议那样的矢量化方法