PANDAS :根据多个if条件为某列的每一行赋值

PANDAS : Assigning a value for each row in certain column based on multiple if condition

我真的是 python 代码的新手,无法将一些类似问题的答案应用到我自己的案例中。请帮忙

所以我有一个包含 A 列和 B 列的数据框,其中有很多行

两者都包含负数和正数,我正在尝试根据以下条件创建一个新的 C 列

如果“第 1 行 A 列的值小于 0”&“第 1 行 B 列的值小于 0”,return“第 1 行 C 列”中的 -100

Elif "第 1 行 A 列的值小于 0" & "第 1 行 B 列的值大于 0", return 100 in "第 1 行 C 列"

Elif "第 1 行 A 列的值大于 0" & "第 1 行 B 列的值小于 0", return 100 in "第 1 行 C 列"

其他:return(列 A.Value / 列 B.Value)在列 C

非常感谢

import pandas as pd

# initialize as list
data = [[1, 10], [3, 45], [56, -6], [-96, -65]] 

# Create the pandas DataFrame
df = pd.DataFrame(data, columns = ['A', 'B'])
print(df)
print('*****************')

df['C'] = None

if df.iat[0,0] < 0 and df.iat[0,1] < 0:
  df.iat[0,2] = -100

elif df.iat[0,0] < 0 and df.iat[0,1] > 0:
  df.iat[0,2]  = 100

elif df.iat[0,0] > 0 and df.iat[0,1] < 0:
  df.iat[0,2]  = 100

else:
  df['C'] = df['A']/df['B'] 

print('New dataFrame:')
print(df)

输出:

    A   B
0   1  10
1   3  45
2  56  -6
3 -96 -65
*****************
New dataFrame:
    A   B         C
0   1  10  0.100000
1   3  45  0.066667
2  56  -6 -9.333333
3 -96 -65  1.476923

如有任何困惑,请告诉我!

我想你在找 np.select:

condlist = [(df['A'] < 0) & (df['B'] < 0),
            (df['A'] < 0) & (df['B'] > 0),
            (df['A'] > 0) & (df['B'] < 0)]

choicelist = [-100, 100, 100]

default = df['A'] / df['B']

df['C'] = np.select(condlist, choicelist, default)

输出:

>>> df
          A          B           C
0 -0.002639  -1.374507 -100.000000
1 -0.696428   9.923431  100.000000
2  1.410547   3.804043    0.370802
3  1.504908   2.701486    0.557067
4  1.867486   1.889067    0.988576
5 -0.451066 -11.529716 -100.000000
6  5.713800  -7.678271  100.000000
7 -4.318760   5.082725  100.000000
8  5.169819  -4.122461  100.000000
9  0.094524  -1.916718  100.000000

设置一个MRE

import pandas as pd
import numpy as np

np.random.seed(2022)
df = pd.DataFrame(np.random.normal(0, 5, (10, 2)), columns=['A', 'B'])

实现此目的的一种方法是定义具有所需逻辑的函数,然后将其传递给沿轴 1 (row-wise) 的 apply 函数。在这种情况下,该函数可能如下所示:

def f(x):

    if x["A"] < 0 and x["B"] < 0:
        return -100
    elif x["A"] < 0 and x["B"] > 0:
        return 100
    elif x["A"] > 0 and x["B"] < 0:
        return 100
    else:
        return x["A"] / x["B"]

然后我们可以生成一些样本数据用于测试目的:

>>> import numpy as np
>>> import pandas as pd
>>> data = np.random.randint(-50, 50, size = (10, 2))
>>> df   = pd.DataFrame(data, columns = ["A", "B"])
>>> df
    A   B
0  23   4
1  10  25
2 -14  45
3  31  32
4  49  32
5 -23  34
6 -10 -29
7  10 -19
8 -45 -48
9  31 -31

最后,我们可以将函数应用于示例数据:

>>> df["C"] = df.apply(f, axis = 1)
>>> df
    A   B          C
0  23   4    5.75000
1  10  25    0.40000
2 -14  45  100.00000
3  31  32    0.96875
4  49  32    1.53125
5 -23  34  100.00000
6 -10 -29 -100.00000
7  10 -19  100.00000
8 -45 -48 -100.00000
9  31 -31  100.00000