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
我有一个大数据框 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