如果我有以下pandas df
A B C D
1 2 3 4
2 2 3 4
我希望将新列添加为1,2或3,具体取决于
(A > B) && (B > C) = 1
(A < B) && (B < C) = 2
Else = 3
最好的办法是什么?
答案 0 :(得分:4)
您可以使用numpy.select
来构建多个条件。最后一个参数代表默认值。
conditions = [(df.A > df.B) & (df.B > df.C),
(df.A < df.B) & (df.B < df.C)]
values = [1, 2]
df['E'] = np.select(conditions, values, 3)
有几种选择:嵌套numpy.where
,顺序pd.DataFrame.loc
,pd.DataFrame.apply
。该解决方案的主要优点是可读性,同时保持矢量化。
答案 1 :(得分:1)
这也可以使用索引和fillna来解决。
df.loc[(df['A'] > df['B'])
&(df['B'] > df['C']), 'New_Col'] = 1
df.loc[(df['A'] < df['B'])
&(df['B'] < df['C']), 'New_Col'] = 2
df['New_Col'] = df['New_Col'].fillna(3)
第一块代码如下所示:找到A&gt;的位置B和B&gt; C,如果这两个条件均为真,则设置列&#39; New_Col&#39;等于1.第二个块可以用相同的方式解释。如果第一个和第二个块都没有返回1或2,那么它们将显示为null。使用fillna()函数用3填充这些空值。
这将产生以下数据帧:
答案 2 :(得分:0)
您可以在df上使用apply
,例如:
df['E'] = df.apply(lambda x: 1 if x.A > x.B and x.B > x.C else 2 if x.A < x.B and x.B < x.C else 3, axis=1)