查找False-True和True-True行索引

时间:2014-07-16 15:40:06

标签: python numpy pandas

我有一个名为data['3_changed']的numpy布尔矢量(取自pandas数据帧)。我只需输入以下内容即可找到标有True的所有值的索引:

In [106]: np.where(data['3_changed'])
Out[106]: (array([    37,     41,     83, ..., 998011, 998019, 998025]),)

现在我想

  1. 访问True
  2. 之前的行
  3. 如果该值为False,也可以获取该行的索引
  4. 我试过了

    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语句执行此检查?

3 个答案:

答案 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