【问题标题】:How to compare each cell in one column with a specific value in pandas?如何将一列中的每个单元格与熊猫中的特定值进行比较?
【发布时间】:2020-05-09 17:09:06
【问题描述】:

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

如果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 这样更复杂怎么办?

【问题讨论】:

  • 您能发布您预期的输出数据帧吗?

标签: python pandas comparison min calculation


【解决方案1】:

因为如果 A 和 B 的值为零,则意味着使用 (3, abs(0)) 之间的最小值,始终为0 的解决方案应使用numpy.wherenumpy.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

【讨论】:

  • 您好,感谢您的回答,只是一个后续问题,如果公式是 C = A + min(3, |A|) * B 而不是最小数字本身怎么办?我怀疑我不能再使用np.where 了?有什么想法吗?
  • @Cecilia - 没问题,只需将np.minimum(3, df.A.abs()) 更改为df.A + np.minimum(3, df.A.abs()) * df.B
  • 谢谢,只是想知道 if 语句会不会变成 if sign(A) == sign(B), D = A + min(3, |A|) * B; if sign(A) == sign(C), D = C + min(3, |A|) * B, else: D = A 这样的东西,我还能用 np.where() 吗?对不起,如果我有太多后续问题,只是想更多地了解这个功能,如果你能给我一些提示,那就太好了:)
  • @Cecilia - 给我秒,但这里需要numpy.select
【解决方案2】:
df['C'] = [min(abs(a), 3) if a*b > 0 else min(b, 3) if a*b < 0 else a for a,b in zip(df.A, df.B)]

【讨论】:

    【解决方案3】:
    df['C'] = np.where(df.A.mul(df.B).gt(0), df.A.abs().clip(upper=3), 
                       np.where(df.A.mul(df.B).lt(0), df.B.clip(upper=3), df.A)
                      )
    
    
        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   5
    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
    

    【讨论】:

      【解决方案4】:

      您可以随意尝试:

      df["C"] = np.where(df["A"]*df["B"]>0, min(3,abs(df["A"]).min()),
                         np.where(df["A"]*df["B"]<0, min(3,df["B"].min()),
                                  df["A"]))
      
      df
         Type subType  A  B  C
      0     X       a -1  4 -2
      1     X       a  5  9  1
      2     X       a  5  9  1
      3     X       b  1  4  1
      4     X       b  3  5  1
      5     X       b  5  0  5
      6     Y       a -1  1 -2
      7     Y       a  3  2  1
      8     Y       a -5  3 -2
      9     Y       b  1  4  1
      10    Y       b  3  5  1
      11    Y       b  5 -2 -2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 2022-11-15
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        相关资源
        最近更新 更多