2017-01-27 37 views
2

を保持I以下のデータフレームを有する:パンダGROUPBYは、第3列

df = pd.DataFrame({'key1': (1,1,1,2), 'key2': (1,2,3,1), 'data1': ("test","test2","t","test")}) 

私はKEY1によってグループ化するとDATA1の分を持っています。さらに私はそれにグループ化せずにkey2の値に従います。

df.groupby(['key1'], as_index=False)['data1'].min() 

は私を取得します。

key1 data1 
1 t 
2 test 

が、私は必要があります。

key1 key2 data1 
1 3 t 
2 1 test 

任意のアイデア?示すように

+0

どのように文字列の 'min'を計算しますか? – EdChum

+0

@EdChum min()は文字列の "t" <"test"として機能します –

答えて

2

あなたはgroupby.applyを利用すると、非グループ化された列を維持しながらx['data1']==x['data1'].min()Trueに等しいすべてのインスタンスを取得することができます。

df.groupby('key1', group_keys=False).apply(lambda x: x[x['data1'].eq(x['data1'].min())]) 

enter image description here


は要素がTrueを返すかを知るにはこれから、DFのサブセットをサブセットします。

df.groupby('key1').apply(lambda x: x['data1'].eq(x['data1'].min())) 

key1 
1  0 False 
     1 False 
     2  True 
2  3  True 
Name: data1, dtype: bool 
+1

驚くばかりです、魅力的です!ありがとう! –