我有一个DataFrame df
:
A B
a 2 2
b 3 1
c 1 3
我想根据以下条件创建新列:
如果行A == B: 0
如果行A > B: 1
如果行A < B: -1
因此,根据上表,它应该是:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
对于典型的if else
情况,我使用np.where(df.A > df.B, 1, -1)
,pandas是否提供了一种特殊的语法,可以一步解决我的问题(无需创建3个新列,然后组合结果)?
7条答案
按热度按时间nmpmafwu1#
将上述一些方法正式化:
创建一个函数,对dataframe的行进行操作,如下所示:
然后将其应用于传入
axis=1
选项的 Dataframe :当然,这不是矢量化的,因此当扩展到大量记录时,性能可能不会那么好。尽管如此,我认为它的可读性要好得多。尤其是来自SAS的背景。
编辑
这里是矢量化的版本
whitzsjs2#
使用索引很容易解决。第一行代码如下所示,如果列
A
等于列B
,则创建列C
并将其设置为0。mwkjh3gx3#
对于这个特定的关系,您可以使用
np.sign
:2sbarzqh4#
当您有多个
if
条件时,numpy.select
是一种选择:k75qkfdt5#
假设上面的一个是你原来的dataframe,你想添加一个新的列'old'
如果年龄大于50,则我们认为年龄较大=是,否则为假
步骤1:获取年龄大于50的行的索引
row_indexes=df[df['age']>=50].index
步骤2:使用.loc我们可以为column分配一个新值
df.loc[row_indexes,'elderly']="yes"
年龄小于50岁
row_indexes=df[df['age']<50].index
df[row_indexes,'elderly']="no"
vc6uscn96#
可以使用
mask
方法:tf7tbtn27#
一个线性解决方案,
list comprehension
和zip()
也是返回所需的输出