2017-07-31 70 views
1

我有一個數據幀,其中一列只包含塊或塊中的True或False值。例如:在熊貓數據框中找到塊中的第一個'真'值

df = 
      b 
    0  False 
    1  True 
    2  True 
    3  False 
    4  True 
    5  True 
    6  True 
    7  True 
    8  False 
    9  False 
10  False 
11  False 
12  False 
13  True 
14  True 
15  True 

我需要找到塊的開始,具有真:

>> find_first_true(df) 
>> array([1, 4, 13]) 

任何優雅的解決方案?

編輯

謝謝你的建議的解決方案。我想知道,從我找到的索引開始,提取特定長度塊的最簡單方法是什麼?

例如,我需要在索引之前佔用長度爲4的塊(行數)。所以,如果(先前發現的)我的指數

index = array([1, 4, 13]) 

然後我需要塊:

[df.loc[0:4], df.loc[9:13]] 

  b 
    0  False 
    1  True 
    2  True 
    3  False 
    4  True 
    9  False 
10  False 
11  False 
12  False 
13  True 

我遍歷索引,但想了解更爲pandasian解決方案

+0

@MedAli,存在True和False值的塊(如示例中所示)。我需要在True值的塊中找到第一個True的索引。或者,如果你喜歡,首先真的錯誤 –

回答

2
In [2]: df = pd.read_clipboard() 

In [3]: df 
Out[3]: 
     b 
0 False 
1 True 
2 True 
3 False 
4 True 
5 True 
6 True 
7 True 
8 False 
9 False 
10 False 
11 False 
12 False 
13 True 
14 True 
15 True 
In [11]: np.where(((df.b != df.b.shift(1)) & df.b).values)[0] 
Out[11]: array([ 1, 4, 13], dtype=int64) 
+0

該死的,這是非常光滑的。 –

+0

我使用'.diff()[1:]'而不是'.shift [1]'。工作很好 –

+0

但是,我錯過了第一個價值。任何想法如何挑選它? –

1
def find_first_true(df): 
    #finds indexes of true elements 
    a = list(map(lambda e: e[0] + 1 if e[1] else 0, enumerate(df))) 
    a = list(filter(bool, a)) 
    a = list(map(lambda x: x - 1, a)) 

    #removes consecutive elements 
    ta = [a[0]] + list(filter(lambda x: a[x] - a[x-1] != 1, range(1, len(a)))) 
    a = list(map(lambda x: a[x], ta)) 

    return a 
1
find_first = [] 
for i in range(len(df)): 
    if (df.loc[i, 'b'] == False and df.loc[i+1, 'b'] == True): 
     find_first.append(i+1) 
相關問題