我面临着以下问题:我可以做条件列计算,但是,我不能对每一行使用函数min、max、mean
import pandas as pd
data = {'Name': ['Tom', 'nick', 'krish', 'jack','bob'],
'level_1': [2, -3, 7, -4,-2],
'level_2': [6, 5, -3, -9,2],
'level_3': [-2, -1, 4, 6,-4],
}
df = pd.DataFrame(data)
print(df)
def f(row):
if (row['level_1'] < 0) & (row['level_2'] < 0):
val = row['level_1'] + row['level_2']
elif (row['level_1'] > 0) & (row['level_2'] > 0):
val = row['level_1'] - row['level_2']
else:
val = row[['level_1','level_2','level_3']].max#(axis=1)
return val
df['level_final'] = df.apply(f, axis=1)
print(40*'#')
print(df)
有谁能帮我一下吗?
1条答案
按热度按时间hzbexzde1#
#更干净更快捷的解决方案
这里有一个更简洁的方法,使用
numpy
,比使用lambda和apply方法(没有对行进行向量化)更快。阅读更多关于
numpy.select
here。#当前代码注意事项
“我需要最大值从每一行(轴=1)的条件”(从您的评论)
你的代码失败的原因是你误解了
apply
方法的工作原理。当你对行使用apply函数时,你是把每一行作为pd.Series
对象拉出来,然后对它应用你的函数f
函数,一次一行。当您在任何row series对象上使用
pd.Series.max(axis=1)
时,它会按预期抛出以下错误-对于一个series对象,你不能使用
max.axis(1)
,因为它没有轴。所以不要使用max
,或者简单地使用max
,这是一个方法的错误语法,只使用pd.Series.max()
。阅读文档here一个三个三个一个