2016-12-27 10 views
1

私はいくつかの列でグループ化する必要があります私はhavパンダのデータフレーム。グループ内のほとんどのグループは1行しか持たないが、少数のグループは複数の行を持つ。これらのそれぞれについて、私は最初の日付で行を保持したいだけです。 私はaggfilterの両方の機能を試しましたが、私の必要としているようには見えません。パンダグループビービー1つの行を選択

def first(df): 
     if len(df) > 1: 
      return df.ix[df['date'].idxmin()] 
     else: 
      return df 

df.groupby(['id', 'period', 'type').agg(first) 
+1

'df.sort_values( '日付')。GROUPBY([ 'ID'、 '区間'、 'タイプ' 検討します]))first() '? – MaxU

答えて

4

最初の行を取得し、最初の行を取得するだけです。

df.sort_values('date').groupby(['id', 'period', 'type']).first() 
2

nsmallest()を使用することができます。

df.groupby(['id', 'period', 'type']).apply(lambda g: g.nsmallest(1, "date")) 
2

フィルタdf最小の日付のインデックスに。
idxminがあなたのインデックスを取得します。それをlocに渡します。

df.loc[df.groupby(['id', 'period', 'type']).date.idxmin()] 

df

df = pd.DataFrame([ 
     ['a', 'q', 'y', '2011-03-31'], 
     ['a', 'q', 'y', '2011-05-31'], 
     ['a', 'q', 'y', '2011-07-31'], 
     ['b', 'q', 'x', '2011-12-31'], 
     ['b', 'q', 'x', '2011-01-31'], 
     ['b', 'q', 'x', '2011-08-31'], 
    ], columns=['id', 'period', 'type', 'date']) 
df.date = pd.to_datetime(df.date) 

df 

    id period type  date 
0 a  q y 2011-03-31 
1 a  q y 2011-05-31 
2 a  q y 2011-07-31 
3 b  q x 2011-12-31 
4 b  q x 2011-01-31 
5 b  q x 2011-08-31 

そして

df.loc[df.groupby(['id', 'period', 'type']).date.idxmin()] 

    id period type  date 
0 a  q y 2011-03-31 
4 b  q x 2011-01-31 
関連する問題