2016-08-22 28 views
3

我想按「類型」列對數據幀進行分組,並從每個相同數字序列中獲取第一個數字。下面的例子說明:提取熊貓羣中相同數字序列中的第一個數字

A = pd.DataFrame({'type':['A','A','A','A','A','A','A','A','A','B','B','B','B','B'], 'value':[1,1,1,1,8,8,8,1,1,2,2,3,3,2]}) 

爲一組,有第一1組的序列,然後8位的,並且最終的1的。對於B組,第一個是2,然後是3中的一個,最後一個是2(僅有一個元素)。結果應該是1,8,1爲A和2,3,2爲B:

type value 
0 A  1 
1 A  8 
2 A  1 
3 B  2 
4 B  3 
5 B  2 

注意,使用A.groupby( '類型')的第一(),也不A.groupby('類型。 ')。(lambda x:x.unique())將起作用,因爲在這兩種情況下,最後1和最後2將被忽略。請注意,如果我有一個索引來標識每個系列的相同數字,這將是微不足道的。

謝謝你,我很欣賞你的幫助,

+0

是按類型排序的數據幀? – ayhan

+0

謝謝ayhan。它是按類型排序 – dleal

回答

1
def first_contiguous(s): 
    return s.groupby(s.ne(s.shift()).cumsum()).head(1) 

A.groupby('type').value.apply(first_contiguous).reset_index('type') 

enter image description here

+0

謝謝piRSquared,這似乎工作得很好!我還有一些其他問題:1)根據* following *值是否等於當前值,s.ne(shift())的結果爲TRUE或FALSE。 cumsum()如何添加這些true和false以提供數字? 2)在我的情況下,我沒有得到列值的名稱,而是我得到零。什麼是解決這個問題的好方法?謝謝你的所有幫助 – dleal

+0

@ddle在技術上,我正在測試電流是否等於先前。每個「True」表示新的一系列相同數字的開始。 'bool'值上的'cumsum'將'True' /'False'視爲'1' /'0'。所以第一個'真'獲得'1'。每個後續的'False'加'0',使'cumsum'保持爲'1',直到下一個'真',此時'cumsum'遞增到'2',這是完美的,因爲這是下一個等號的開始值。然後我用這個來'groupby'。 – piRSquared

+0

@ddleal我不明白你的第二個問題。 – piRSquared

相關問題