我有一个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
而不是常规的括号切片。
答案 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)
df.eq(df.iloc[:, 0], axis=0).all(1)