熊猫:新专栏;如果列A,B,C等于0,则列等于0。否则1

时间:2019-05-13 22:10:26

标签: python pandas

我有一个multiindex pandas数据框,已将其简化为以下内容:

idx = pd.IndexSlice
slice = data.loc[:, idx[1, ['Gx', 'Gy', 'Gz'], 'value']]
           1            
          Gx    Gy    Gz
       value value value
0        -26    37   -72
1        -28    37   -72
2        -27    37   -71
3        -28    37   -75
4        -27    38   -75
5        -29    40   -75
6        -30    39   -78
...

我需要获取另一列,如果Gx,Gy,Gz都等于0,否则等于1,则该列为0。

我希望将其向量化,因此我试图避免使用apply,尽管似乎无法以向量化的方式进行,因为两个序列不能在相等性上进行比较。

result = slice.loc[:, idx[i, 'Gx', 'value']] == slice.loc[:, idx[i, 'Gy', 'value']] == slice.loc[:, idx[i, 'Gz', 'value']] == 0

失败,因为ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这似乎应该易于矢量化,但是我能找到的所有类似示例都使用apply()

我知道np.where()可以和类似的东西一起使用,但是据我了解,这是不可能的。因为slice是多索引的,所以np.where()无法使用它,因为我需要使用.loc而不是常规的括号切片。

3 个答案:

答案 0 :(得分:2)

nunique的提示

slice.nunique(1).ne(1).astype(int)
Out[846]: 
0    1
1    1
2    1
3    1
4    1
5    1
6    1
dtype: int32

已更新

slice.abs().sum(1).ne(0)

答案 1 :(得分:1)

由于0为假,因此您可以使用any

slice_.any(1).astype(int)

答案 2 :(得分:0)

使用pd.Dataframe.eq.all

df.eq(df.iloc[:, 0], axis=0).all(1)