如果数据框中所有列都相等,则设置值 - Pandas

4
我有一个数据框,我是这样读取的:

df = pd.read_csv(myfile, delimiter=";")
df = df.set_index('date')
print(df)


      NET_0  NET_1  NET_2  NET_3  NET_4  NET_5  NET_6  NET_7  NET_8  NET_9  NET_10  NET_11  NET_12  NET_13  NET_14  NET_15  NET_16  NET_17  NET_18  NET_19  NET_20  NET_21  NET_22  NET_23  NET_24  NET_25
date                                                                                                                                                                                                            
2009-08-02      0      0      0      1      1      1      0      1      1      0       0       1       0       0       1       0       0       0       0       0       1       0       1       1       1       1
2009-08-03      0      0      0      1      1      1      0      0      1      0       1       1       0       0       1       1       0       0       0       0       1       0       1       1       1       1
2009-08-04      0      0      0      1      1      1      0      1      1      0       0       1       0       0       1       0       0       0       0       0       1       0       1       1       1       1
2009-08-05      0      0      0      1      1      1      0      1      1      0       1       1       0       0       1       0       0       0       0       0       1       0       1       1       1       1
2009-08-06      0      0      0      0      0      0      0      0      0      0       0       0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      
2009-08-07      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1

我希望得到以下结果:如果一行中的所有net_*列都相等,我想要 1 作为结果,如果一行中的所有列都等于0,则为 -1,否则为 0。类似于:
date    enseamble
2009-08-02     0
2009-08-03     0
2009-08-04     0
2009-08-05     0
2009-08-06     -1
2009-08-07     1

有没有不用for循环的快速方法?谢谢。
2个回答

5

尝试使用np.select()

m1=df.eq(1).all(axis=1) #check if all column in each row is 1
m2=df.eq(0).all(axis=1) ##check if all column in each row is 0

使用np.select()函数,将条件列表和选择列表传递给每个条件(请参考提供的链接中的文档)。
df['enseamble']=np.select([m1,m2],[1,-1],0) #using np.select expaination in docs
#to drop the remaining columns f, find difference between enseamble and other columns like below and call under axis=1:
m=df.drop(df.columns.difference(['enseamble']),axis=1) 
print(m)

                     enseamble
date                         0
2009-08-02 00:00:00          0
2009-08-03 00:00:00          0
2009-08-04 00:00:00          0
2009-08-05 00:00:00          0
2009-08-06 00:00:00         -1
2009-08-07 00:00:00          1

很棒的答案。你能写一些注释来解释代码如何工作吗?我会将其标记为正确答案。 - Aso Strife
1
@AsoStrife 完成了..!! 如果你需要任何理解上的帮助,请告诉我.. :) - anky
今天我在这里问了一个非常相似的问题:https://stackoverflow.com/questions/55421118/pandas-set-value-if-most-columns-are-equal-in-a-dataframe 请你看一下可以吗? - Aso Strife

1
Pandas文档中,我认为all()函数适合您。 (特别是因为您的数据似乎是布尔形式。)
df.all(axis=None)

这将评估整个数据框并返回True或False。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接