2016-08-22 1 views
3

データフレームを 'タイプ'列でグループ化し、同じ番号の各シーケンスから最初の番号を取得したいと考えています。次の例では示していますグループAについてパンダのグループ内の同じ番号のシーケンスで最初の数字を抽出する

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]}) 

は、そこに、8のの、第1のシーケンスであり、1の終。グループBには、2のうちの最初の1つ、3の1つ、2の最後の1つがあります(1つの要素のみ)。その結果、BのAの1,8,1および2,3,2にすべきである:

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

なお、第1 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)s.ne(shift())の結果は、* following *値が現在の値と等しいかどうかに応じてTRUEまたはFALSEです。どのようにcumsum()は、これらの真と偽の数字を思いつくために追加しますか? 2)私の場合、私は列の値の名前を取得する代わりに、私はゼロを得る。これを解決するにはどうすればよいでしょうか?すべてのyorの助けをありがとう – dleal

+0

技術的に、私は現在の前と等しいかどうかをテストしています。それぞれの「真」は、新しい一連の等しい数の始まりを示す。 'bool'値の' cumsum'は 'True' /' False'を '1' /' 0'として扱います。最初の 'True'は' 1'になります。それ以降の 'False'は' cumsum'を '1'に保ち、次の' True'までは '0'を追加し、' cumsum'は '2'にインクリメントします。値。私は 'groupby'にこれを使います。 – piRSquared

+0

@dleal私はあなたの2番目の質問を理解していません。 – piRSquared

関連する問題