使用此示例数据::
df = pd.DataFrame({'a': {0: 6, 1: 4, 2: 5, 3: 4, 4: 2},
'b': {0: 1, 1: -1, 2: 2, 3: -1, 4: -1},
'c': {0: 4, 1: 3, 2: 3, 3: 2, 4: 4}})
我使用这3个表单中的一个来创建一个新列::
我们通过申请轴= 1 ::
来实现df['ts'] = df.apply(lambda x: 'XS' if x.a * x.b - x.c > 1 else 'L', axis=1)
或者使用pandas loc查询API (过去常说较慢)::
df.loc[:, 'ts2'] = 'L'
df.loc[df.a * df.b - df.c > 1, 'ts2'] = 'XL'
或者if else np.where ::
df['ts3'] = np.where(df.a * df.b - df.c > 1, 'XS', 'L')
这三个都很好用::
df
# a b c ts ts2 ts3
# 0 6 1 4 XS XL XS
# 1 4 -1 3 L L L
# 2 5 2 3 XS XL XS
# 3 4 -1 2 L L L
# 4 2 -1 4 L L L
奇怪的是,新的pandas.v16 分配会为此引发错误::
df.assign(ts4=lambda x: 'XS' if x.a * x.b - x.c > 1 else 'L')
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我的感觉是,如果我们不能使用这样的结构,那么assign方法会失去很多兴趣。