2016-03-18 12 views
0

Nach gruppierten Daten, möchte ich aus den Ergebnisgruppen, die nur eine einzige Beobachtung mit dem Wert unter einem bestimmten Schwellenwert enthalten, fallen lassen.Pandas: Filterung nach Gruppengröße und Datenwert

Erste Daten:

df = pd.DataFrame(data={'Province' : ['ON','QC','BC','AL','AL','MN','ON'], 
          'City' :['Toronto','Montreal','Vancouver','Calgary','Edmonton','Winnipeg','Windsor'], 
          'Sales' : [13,6,16,8,4,3,1]}) 

     City Province Sales 
0 Toronto  ON  13 
1 Montreal  QC  6 
2 Vancouver  BC  16 
3 Calgary  AL  8 
4 Edmonton  AL  4 
5 Winnipeg  MN  3 
6 Windsor  ON  1 

nun die Gruppierung der Daten:

df.groupby(['Province', 'City']).sum() 

        Sales 
Province City 
AL  Calgary  8 
     Edmonton  4 
BC  Vancouver  16 
MN  Winnipeg  3 
ON  Toronto  13 
     Windsor  1 
QC  Montreal  6 

Jetzt ist der Teil ich kann nicht herausfinden, wie Provinzen mit nur einer Stadt (oder allgemein N Beobachtungen) fallen mit dem Gesamtumsatz kleiner als 10. Die erwartete Ausgabe sollte sein:

    Sales 
Province City 
AL  Calgary  8 
     Edmonton  4 
BC  Vancouver  16 
ON  Toronto  13 
     Windsor  1 

Ie MN/Winnipeg und QC/Montreal sind von den Ergebnissen weg. Idealerweise werden sie nicht komplett weg sein, sondern zu einer neuen Gruppe namens "Andere" zusammengefasst, was aber für eine andere Frage von Bedeutung sein könnte.

Antwort

1

können Sie es auf diese Weise tun:

In [188]: df 
Out[188]: 
     City Province Sales 
0 Toronto  ON  13 
1 Montreal  QC  6 
2 Vancouver  BC  16 
3 Calgary  AL  8 
4 Edmonton  AL  4 
5 Winnipeg  MN  3 
6 Windsor  ON  1 

In [189]: g = df.groupby(['Province', 'City']).sum().reset_index() 

In [190]: g 
Out[190]: 
    Province  City Sales 
0  AL Calgary  8 
1  AL Edmonton  4 
2  BC Vancouver  16 
3  MN Winnipeg  3 
4  ON Toronto  13 
5  ON Windsor  1 
6  QC Montreal  6 

Jetzt werden wir eine Maske für die "Provinzen mit mehr als einer Stadt erstellen:

In [191]: mask = g.groupby('Province').City.transform('count') > 1 

In [192]: mask 
Out[192]: 
0  True 
1  True 
2 False 
3 False 
4  True 
5  True 
6 False 
dtype: bool 

und Städte mit dem Gesamtumsatz größer oder gleich 10 win:

In [193]: g[(mask) | (g.Sales >= 10)] 
Out[193]: 
    Province  City Sales 
0  AL Calgary  8 
1  AL Edmonton  4 
2  BC Vancouver  16 
4  ON Toronto  13 
5  ON Windsor  1 
+0

Kann 'Filter' in irgendeiner Weise verwendet werden? –

+0

@DmitryB., Ich weiß es noch nicht. Aber wie stimmt es mit Ihrer ursprünglichen Frage überein? – MaxU

+0

Es ist alles ein Teil von mir, Pandas zu lernen –

1

war ich mit einem der gegebenen Antworten nicht zufrieden, so hielt ich an diesem Chipping bis Ich habe die folgende Lösung herausgefunden:

In [72]: df 
Out[72]: 
     City Province Sales 
0 Toronto  ON  13 
1 Montreal  QC  6 
2 Vancouver  BC  16 
3 Calgary  AL  8 
4 Edmonton  AL  4 
5 Winnipeg  MN  3 
6 Windsor  ON  1 

In [73]: df.groupby(['Province', 'City']).sum().groupby(level=0).filter(lambda x: len(x)>1 or x.Sales > 10) 
Out[73]: 
        Sales 
Province City 
AL  Calgary  8 
     Edmonton  4 
BC  Vancouver  16 
ON  Toronto  13 
     Windsor  1 
Verwandte Themen