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
我真的是 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