Pandas groupby 在多列中查找符号模式

Pandas groupby finding sign pattern in multiple columns

我有一个大数据框 df:

Col1    Col2    Col3    Val1    Val2
A1      B1      c1     -0.2     0
A1      B1      c2     -0.3     0.3
A1      B1      c3     -0.5     0.2
A2      B2      c1     -0.3     0.1
A2      B2      c2      0.7    -0.3
A3      B3      c1     -0.3     0.3

期望的结果:

Col1    Col2    Col3    Val1    Val2  Pattern
A1      B1      c1     -0.2     0     Y
A1      B1      c2     -0.3     0.3   Y
A1      B1      c3     -0.5     0.2   Y
A2      B2      c1     -0.3     0.1   N
A2      B2      c2      0.7    -0.3   N
A3      B3      c1     -0.3     0.3   Y

对于每组 Col1 和 Col2,如果每个 (Val1, Val2) 的符号模式为 (negative, greater than equal 0)

,我想将模式标记为 Y

我正在尝试以下类型的操作:

signs = np.sign(df[['Val1', 'Val2']])
m1 = signs.eq([-1, 1]).all(axis=1)
df['Pattern'] = m1.groupby([df['Col1'], df['Col2']])\
                  .transform('all').all(axis=1)\
                  .map({True:'Y', False: 'N'})

但是,上面的代码显然达不到我需要的。基本上 m1 上面的框架不正确。

使用groupby np.where

df['Pattern'] = np.where(df.groupby('Col1').apply(lambda x:(x['Val1'].lt(0))&(x['Val2'].ge(0)).all()),'Y','N')

问题来自符号的 numpy 解释。

使用你自己的函数,但替换了 numpy...

df["Pattern"]=((df.Val1<0) & (df.Val2>=0))\
    .groupby([df['Col1'], df['Col2']])\
    .transform('all')\
    .map({True:"Y",False:"N"})

>>> df
  Col1 Col2 Col3  Val1  Val2 Pattern
0   A1   B1   c1  -0.2   0.0       Y
1   A1   B1   c2  -0.3   0.3       Y
2   A1   B1   c3  -0.5   0.2       Y
3   A2   B2   c1  -0.3   0.1       N
4   A2   B2   c2   0.7  -0.3       N
5   A3   B3   c1  -0.3   0.3       Y