2015-02-09 84 views
1

交替布爾有了如下所示一個數據幀:如何高效地查找索引的熊貓數據幀

 A  B 
0 True False 
1 True False 
2 True False 
3 False True 
4 False False 
5 True False 

我需要獲得索引列表交替列A和B之間的布爾值。因此,第一次列A顯示True,我可以將0添加到列表中。現在我切換到B列,找到0之後的下一個索引,它顯示True,它是3.然後,我切換回列A,在索引3後添加下一個索引以顯示True。最後,我將列出一個包含值[0,3,5]。我目前正在通過遍歷for循環中的行和if語句來構建這些列表。我不認爲這是可以做到的最有效的方式。任何幫助「正確」的方式來做到這一點將不勝感激。謝謝!

回答

0

這樣比較好嗎?

inputList=[(True,False),(True,False),(True,False), 
      (False,True),(False,False),(True,False)] 
l=list() 
toggle=0 

for i in range(0,len(inputList)): 
    if (inputList[i][toggle%2]==True): 
     l.append(i) 
     toggle+=1 
print l 
+0

隨意,如果你需要任何評論。 – Jean 2015-02-09 06:17:48

1

的一種方法是這樣的:

在[3]:

df['C'] = df.A.astype(int) - df.B.astype(int) 
df['D'] = df[['C']].apply(lambda x: (x != x.shift()).astype(int).cumsum()) 
df[(df.C == 1) | (df.C == -1)].groupby('D').head(1).index 

出[3]:

Int64Index([0, 3, 5], dtype='int64') 

我還沒有廣泛的測試它,但它適用於您提供的樣品,包括這一個:

df = pd.DataFrame({'A': [True, True, False, True, False, False, True], 
        'B': [False, False, True, False, False, True, False]}) 

[4]:

df['C'] = df.A.astype(int) - df.B.astype(int) 
df['D'] = df[['C']].apply(lambda x: (x != x.shift()).astype(int).cumsum()) 
df[(df.C == 1) | (df.C == -1)].groupby('D').head(1).index.tolist() 

出[4]:

[0, 2, 3, 5, 6] 
+0

感謝您的答案入門。我之前從未和groupby合作過,所以我很難理解它是如何工作的。尤其是當它的組超過一列。我用一個不同的數據框測試了你的代碼,它並沒有給我預期的結果。 A = [True,True,False,True,False,False,True] B = [False,False,True,False,False,True,False] [0,2,5]而不是[0 ,2,3,5,6] – user1217458 2015-02-10 00:49:30

+0

很難高估'.groupby'操作的重要性,所以我鼓勵你看看[docs]中的例子(http://pandas.pydata.org/pandas-docs /stable/groupby.html)或者在論壇中。理解代碼的最好方法是將其分解並查看它的功能。我已經更新了代碼以考慮這個新案例。我確信現在在任何情況下都能正常工作。因爲你沒有在任何地方提及它,所以它會忽略「A」和「B」都是「真」的行。但是您可以在代碼設置條件的第3行將其更改爲'df.C!= 0'。 – Primer 2015-02-10 10:40:18