根据 if-elif-else 条件创建新列[重复]
- 2025-02-07 08:44:00
- admin 原创
- 61
问题描述:
我有一个数据框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 个新列然后合并结果)?
解决方案 1:
为了形式化上面列出的一些方法:
创建一个对数据框的行进行操作的函数,如下所示:
def f(row):
if row['A'] == row['B']:
val = 0
elif row['A'] > row['B']:
val = 1
else:
val = -1
return val
然后将其应用到您的数据框并传递选项axis=1
:
In [1]: df['C'] = df.apply(f, axis=1)
In [2]: df
Out[2]:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
当然,这不是矢量化的,因此在扩展到大量记录时性能可能不太好。不过,我认为它的可读性更强。尤其是来自 SAS 背景的人。
编辑
这是矢量化版本
df['C'] = np.where(
df['A'] == df['B'], 0, np.where(
df['A'] > df['B'], 1, -1))
解决方案 2:
df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1
使用索引很容易解决。第一行代码如下,如果列A
等于列,B
则创建并将列设置C
为 0。
解决方案 3:
对于这种特殊的关系,您可以使用np.sign
:
>>> df["C"] = np.sign(df.A - df.B)
>>> df
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
解决方案 4:
当你有多个if
条件时,numpy.select
要采取以下方法:
In [4102]: import numpy as np
In [4098]: conditions = [df.A.eq(df.B), df.A.gt(df.B), df.A.lt(df.B)]
In [4096]: choices = [0, 1, -1]
In [4100]: df['C'] = np.select(conditions, choices)
In [4101]: df
Out[4101]:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
解决方案 5:
假设上面是你的原始数据框,而你想添加一个新列“旧”
如果年龄大于 50 岁,则我们认为年龄较大=是,否则为 False
步骤 1:获取年龄大于 50 的行的索引
row_indexes=df[df['age']>=50].index
步骤 2:使用 .loc 我们可以为列分配一个新值
df.loc[row_indexes,'elderly']="yes"
50 岁以下同
row_indexes=df[df['age']<50].index
df[row_indexes,'elderly']="no"
解决方案 6:
您可以使用该方法mask
:
df['C'] = np.nan
df['C'] = df['C'].mask(df.A == df.B, 0).mask(df.A > df.B, 1).mask(df.A < df.B, -1)
解决方案 7:
一个单行解决方案list comprehension
也是zip()
df.loc[:,'C']= [0 if d1==d2 else 1 if d1>d2 else -1 for d1,d2 in zip(df.A,df.B)]
返回所需的输出
解决方案 8:
这是实现所需结果的一行代码。此行代码将新列“C”分配给 DataFrame“df”。如果列“A”和“B”中的值相等,则新列“C”的值为 0;如果列“A”中的值大于列“B”中的值,则新列“C”的值为 1;如果列“A”中的值小于列“B”中的值,则新列“C”的值为 -1。
为了实现这一点,在 DataFrame 'df' 上使用 apply 函数。apply 函数沿 DataFrame 的给定轴应用函数。在本例中,轴设置为 1,这意味着该函数将应用于 DataFrame 中的每一行。
所应用的函数是一个 lambda 函数,以一行作为输入。它检查当前行的“A”列和“B”列中的值,并为新列“C”返回适当的值(0、1 或 -1)。
运行此行代码后,DataFrame“df”将有一个额外的列“C”,其中包含基于“A”列和“B”列的比较计算出的值。
import pandas as pd
df['C'] = df.apply(lambda row: 0 if row['A'] == row['B'] else 1 if row['A'] > row['B'] else -1, axis=1)