2016-07-11 10 views
2

den folgenden Datenrahmen vor:Filter Pandas Datenrahmen von GroupBy Inhalt

records = [{'item': 'Widget A', 'quantity': 50, 'revenue': 25.0, 'trandate': '2016-3-24'}, 
     {'item': 'Widget B', 'quantity': 6, 'revenue': 72.0, 'trandate': '2016-3-28'}, 
     {'item': 'Widget C', 'quantity': 5, 'revenue': 75.0, 'trandate': '2016-3-28'}, 
     {'item': 'Widget A', 'quantity': 168, 'revenue': 84.0, 'trandate': '2016-3-29'}, 
     {'item': 'Widget B', 'quantity': 6, 'revenue': 84.0, 'trandate': '2016-3-29'}] 
    indices = [487, 488, 493, 495, 497] 
    df = pd.DataFrame(records, index=indices) 

Nachgeben

id item  quantity revenue trandate 
    487 Widget A  50  25.0 2016-3-24 
    488 Widget B   6  72.0 2016-3-28 
    493 Widget C   6  75.0 2016-3-28 
    495 Widget A   6  84.0 2016-3-29 
    497 Widget B   6  84.0 2016-3-29 

Ich brauche diesen Datenrahmen in zwei komplementäre Sätze aufgeteilt:

  1. Ein Datenrahmen, dass enthält die ersten Transaktionen für jede item:

    id item  quantity revenue trandate 
    487 Widget A  50  25.0 2016-3-24 
    488 Widget B   6  72.0 2016-3-28 
    493 Widget C   6  75.0 2016-3-28 
    
  2. Ein Datenrahmen, die die ersten Transaktionen für jeden item ausschließt:

    id item  quantity revenue trandate 
    495 Widget A   6  84.0 2016-3-29 
    497 Widget B   6  84.0 2016-3-29 
    

würde Ich mag df von einem GroupedBy Objekt filtern, aber ich kann nicht df ‚s Indizes bekommen Nach dem Gruppieren:

gb = df.groupby('item') 
    >>> gb.groups 
    # {'Widget A': [487, 495], 'Widget B': [488, 497], 'Widget C': [493]} 
    >>> gb['trandate'].min() 
    item 
    Widget A 2016-3-24 
    Widget B 2016-3-28 
    Widget C 2016-3-28 

Kann ich GroupBy verwenden, um ein Da zu erhalten? taFrame wie:

id item 
    487 Widget A 2016-3-24 
    488 Widget B 2016-3-28 
    493 Widget C 2016-3-28 

Antwort

3

Ich glaube, Sie Filter müssen von mask von cumcount erstellt:

print (df.groupby('item').cumcount()) 
487 0 
488 0 
493 0 
495 1 
497 1 
dtype: int64 

print (df[df.groupby('item').cumcount() == 0]) 
     item quantity revenue trandate 
487 Widget A  50  25.0 2016-3-24 
488 Widget B   6  72.0 2016-3-28 
493 Widget C   5  75.0 2016-3-28 

print (df[df.groupby('item').cumcount() > 0]) 
     item quantity revenue trandate 
495 Widget A  168  84.0 2016-3-29 
497 Widget B   6  84.0 2016-3-29 
Verwandte Themen