python - 如何将一列中的每个单元格与 pandas 中的特定值进行比较?

标签 python pandas comparison min calculation

我有一个像这样的数据框,我想实现这个:

如果A的符号与B的符号相同,则得到一个新列C = min(3, |A|); 如果 A 的符号与 B 的符号不同,则 C = min(3, B); 如果 A 和 B 的值为零,则 C=A

Type subType  A       B     C     
 X    a       -1      4     3   
 X    a       5       9     3
 X    a       5       9     3
 X    b       1       4     1   
 X    b       3       5    ...
 X    b       5       0
 Y    a       -1      1         
 Y    a       3       2  
 Y    a       -5      3
 Y    b       1       4        
 Y    b       3       5 
 Y    b       5      -2

我尝试过:

if df["A"] * df["B"] > 0:
    df["C"] = (3, abs(df["A"]).min(axis=1)

它给了我错误,似乎我无法直接将值“3”与列进行比较,有什么建议吗?

后续:如果公式更复杂,例如 C = A + min(3, |A|) *B 怎么办?

最佳答案

因为如果 A 和 B 的值为零,则意味着使用 (3, abs(0)) 之间的最小值,而始终 0 的解决方案应使用 numpy.where 进行简化和 numpy.minimum :

#compare signs
m = np.sign(df["A"]) == np.sign(df["B"])
#alternative
#m = (df["A"] * df["B"]) >= 0
df['C'] = np.where(m, np.minimum(3, df.A.abs()), np.minimum(3, df.B))
print (df)
   Type subType  A  B  C
0     X       a -1  4  3
1     X       a  5  9  3
2     X       a  5  9  3
3     X       b  1  4  1
4     X       b  3  5  3
5     X       b  5  0  0
6     Y       a -1  1  1
7     Y       a  3  2  3
8     Y       a -5  3  3
9     Y       b  1  4  1
10    Y       b  3  5  3
11    Y       b  5 -2 -2

编辑:如果 pandas/numpy 中需要更多条件,可以使用多个 np.where 函数 numpy.select :

m1 = np.sign(df.A) == np.sign(df.B)
m2 = np.sign(df.A) == np.sign(df.C)

s1 = df.A + np.minimum(3, df.A.abs()) * df.B
s2 = df.C + np.minimum(3, df.A.abs()) * df.B

df['D'] = np.select([m1, m2], [s1, s2], default=df.A)
print (df)
   Type subType  A  B  C   D
0     X       a -1  4  3  -1
1     X       a  5  9  3  32
2     X       a  5  9  3  32
3     X       b  1  4  1   5
4     X       b  3  5  3  18
5     X       b  5  0  0   5
6     Y       a -1  1  1  -1
7     Y       a  3  2  3   9
8     Y       a -5  3  3  -5
9     Y       b  1  4  1   5
10    Y       b  3  5  3  18
11    Y       b  5 -2 -2   5

关于python - 如何将一列中的每个单元格与 pandas 中的特定值进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59878380/

相关文章:

php - 精确匹配 PHP 数组的键

python - 是否可以删除(不仅仅是取消链接)类(class)?

python - 为什么数据透视表中有 NaN?

Python Pandas - Dataframe 列 - 将格式为 '2015/2016' 的 FY 转换为 '15/16'

python - 通过查找其他行中的值创建新的 pandas 数据框列

algorithm - 字符串比较算法,相关性, "alike"2个字符串是多少

python - python中的快速数据比较

python - 如何循环遍历 (none, 256) 形状张量数组?

python - 使用 microsoft azure 机器学习运行 python 脚本

python - 如何使用 cvxopt 求解二元线性规划? Python