首页 > 解决方案 > 使用熊猫为具有特定条件的每一行设置列值

问题描述

这个问题与我之前问过的另一个问题非常相似:Pandas set value if most columns are equal in a dataframe

我有这个数据框:

      NET_0  NET_1  NET_2  NET_3  NET_4  NET_5  NET_6
date                                                                                                                                                                                                            
2009-08-02      2      2     2      2      2      0     
2009-08-03      0      0     0      2      2      1     
2009-08-04      1      1     1      0      1      2          

我需要生成一个名为ensemble遵循以下特定条件的新列:

a) 1 的计数低于特定阈值count(1) < 20%(必须始终验证,阈值可以更改)

b) SET 2 如果 (a) 被验证并且 2 的数量大于 0 的数量的两倍count(2) > (2 * count(0))

c) 如果 (a) 被验证并且 0 的数量大于 2 的数量,则 SET 0count(0) > count(2)

这应该是我想要的结果:

date    enseamble
2009-08-02     2
2009-08-03     0
2009-08-04     1

标签: pythonpandas

解决方案


使用numpy.selectwith 比较所有值 by DataFrame.eq,对于阈值使用mean和对于 count Trues 值使用sum

#if necessary convert date to index
#df = df.set_index('date')

m1 = df.eq(1).mean(1) < 0.2
m2 = df.eq(2).sum(1) > 2 * df.eq(1).sum(1)
m3 = df.eq(0).sum(1) >  df.eq(2).sum(1)
df['enseamble'] = np.select([m1 & m2, m1 & m3], [2,0], default=1)
print (df)
            NET_0  NET_1  NET_2  NET_3  NET_4  NET_5  enseamble
date                                                           
2009-08-02      2      2      2      2      2      0          2
2009-08-03      0      0      0      2      2      1          0
2009-08-04      1      1      1      0      1      2          1

推荐阅读