当存在多个变量时,在python数据帧中使用lambda实现if-else

当存在多个变量时,在python数据帧中使用lambda实现if-else,python,python-3.x,pandas,if-statement,lambda,Python,Python 3.x,Pandas,If Statement,Lambda,我试图在处理数据帧时在python中实现if-elif或if-else逻辑。当我在不止一个专栏中工作时,我很挣扎 样本数据帧 df=pd.DataFrame({"one":[1,2,3,4,5],"two":[6,7,8,9,10], "name": 'a', 'b', 'a', 'b', 'c'}) 如果我的If-else逻辑只基于一列,那么我知道怎么做 df['one'] = df["one"].apply(lambda x: x*10 if x<2 else (x**2 if x&

我试图在处理数据帧时在python中实现if-elif或if-else逻辑。当我在不止一个专栏中工作时,我很挣扎

样本数据帧

df=pd.DataFrame({"one":[1,2,3,4,5],"two":[6,7,8,9,10], "name": 'a', 'b', 'a', 'b', 'c'})
如果我的If-else逻辑只基于一列,那么我知道怎么做

df['one'] = df["one"].apply(lambda x: x*10 if x<2 else (x**2 if x<4 else x+10))
如果我写一些像x.isin(['a','b')的东西,它就不会工作。

你可以这样做

df.apply(lambda x: x["one"] + x["two"], axis=1)
但是我不认为像
lambda x:x[“一”]*100如果x[“二”]>8这样长的lambda(x[“一”]*1如果x[“二”]8:
返回x[“一”]*100
elif x[“两个”]<8:
返回x[“一”]
其他:
返回x[“一”]**2
应用(my_回调,axis=1)
跨列应用 使用代替并指定轴=1:

df['one'] = df.apply(lambda row: row['one']*100 if row['two']>8 else \
                     (row['one']*1 if row['two']<8 else row['one']**2), axis=1)
可读?是的。但这不是矢量化的。我们一次一行地遍历每一行。我们还可以使用一个列表。Pandas不仅仅用于巧妙的表格式设置,还可以用于使用连续内存块中的数组进行矢量化计算。因此,让我们再试一次

矢量化计算 使用:


感谢您非常详细的回答。即使lambda方法不可读,我也只是想了解它是如何工作的。我自己尝试并想出了第二种方法,但在使用函数时我无法使df.isin()方法工作。我尝试了这个-if df['name'].isin(['a','b']):df['one']=10返回df['one'].但我得到错误'str'对象没有属性isin。
if df['name'].isin(['a','b'])  df['one'] = 100 else df['one'] = df['two']
df.apply(lambda x: x["one"] + x["two"], axis=1)
def my_callback(x):
    if x["two"] > 8:
        return x["one"]*100
    elif x["two"] < 8:
        return x["one"]
    else:
        return x["one"]**2

df.apply(my_callback, axis=1)
df['one'] = df.apply(lambda row: row['one']*100 if row['two']>8 else \
                     (row['one']*1 if row['two']<8 else row['one']**2), axis=1)
def calc(row):
    if row['two'] > 8:
        return row['one'] * 100
    elif row['two'] < 8:
        return row['one']
    else:
        return row['one']**2

df['one'] = df.apply(calc, axis=1)
df['one'] = np.where(row['two'] > 8, row['one'] * 100,
                     np.where(row['two'] < 8, row['one'],
                              row['one']**2))
df['one'] = np.where(df['name'].isin(['a', 'b']), 100, df['two'])