我有一个名为data['3_changed']
的numpy布尔矢量(取自pandas数据帧)。我只需输入以下内容即可找到标有True
的所有值的索引:
In [106]: np.where(data['3_changed'])
Out[106]: (array([ 37, 41, 83, ..., 998011, 998019, 998025]),)
现在我想
True
值False
,也可以获取该行的索引我试过了
np.where(data['3_changed'].diff())
但是,这会返回具有False-True
分组的行,并排除True-True
行。例如,下面将排除行997932和997933。
997928 False
997929 False
997930 False
997931 False
997932 True
997933 True
997934 False
997935 False
997936 False
997937 False
997938 False
997939 False
997940 False
997941 False
997942 True
有没有办法有效地迭代我的DataFrame data
并使用某种if
语句执行此检查?
答案 0 :(得分:0)
如果您的布尔数组被称为a
,则可以使用
a | numpy.r_[a[1:], False]
在某个索引处获取True
的数组,只要原始数组在该索引处为True
或后续索引。现在,您可以在此neww数组上使用numpy.where()
来检索所有所需的索引。
示例:
> a = numpy.array([False, False, True, True, False, False, True, False])
> a | numpy.r_[a[1:], False]
array([False, True, True, True, False, True, True, False], dtype=bool)
答案 1 :(得分:0)
假设我了解你,并且你正在寻找元素为True或下一个元素为True的索引,你可以利用shift
并使用
s.index[s | s.shift(-1)]
例如:
>>> s = pd.Series([False, False, True, False, False, False, True, True])
>>> s
0 False
1 False
2 True
3 False
4 False
5 False
6 True
7 True
dtype: bool
>>> s | s.shift(-1)
0 False
1 True
2 True
3 False
4 False
5 True
6 True
7 True
dtype: bool
>>> s.index[s | s.shift(-1)]
Int64Index([1, 2, 5, 6, 7], dtype='int64')
答案 2 :(得分:0)
使用shift(distance)
比较两行:
data = '''idx a
997928 False
997929 False
997930 False
997931 False
997932 True
997933 True
997934 False
997935 False
997936 False
997937 False
997938 False
997939 False
997940 False
997941 False
997942 True'''
import pandas as pd
from StringIO import StringIO
df = pd.DataFrame.from_csv( StringIO(data), sep='\s+' )
#df['b'] = df['a'].shift(-1)
print df
print df[ (df['a'] == False) & (df['a'].shift(-1) == True) ]
结果
a
idx
997931 False
997941 False
然后,您可以使用.index
仅获取indexes
print df[ (df['a'] == False) & (df['a'].shift(-1) == True) ].index
BTW:您可以添加df['b'] = df['a'].shift(-1)
来查看比较值
a b
idx
997928 False False
997929 False False
997930 False False
997931 False True
997932 True True
997933 True False
997934 False False
997935 False False
997936 False False
997937 False False
997938 False False
997939 False False
997940 False False
997941 False True
997942 True NaN