2016-12-29 4 views
0

ich folgende Datenrahmen haben:Pandas zählen am häufigsten Elemente in verschachtelten Listen innerhalb gropby und bekommen nlargest

      animals 
2016-12-26 11:03:10  [dog] 
2016-12-26 11:03:13  [dog, cat] 
2016-12-26 12:03:13  [elephant, cat] 
2016-12-26 12:03:13  [cow, dog] 
2016-12-27 11:03:10  [cow, dog, cat] 
2016-12-27 11:03:13  [elephant] 
2016-12-27 12:03:13  [elephant] 
2016-12-27 12:03:13  [dog, cat] 

Ich brauche N häufigsten Tiere erhalten und ihre Zählung nach Datum. Zum Beispiel (N = 2):

   animal size 
2016-12-26  dog  3 
       cat  2 
2016-12-27  cat  2 
      elephant  2 

Wie kann ich das tun in Pandas 0.19.x?

+3

Willkommen bei Stack-Überlauf! Du scheinst jemanden zu bitten, etwas Code für dich zu schreiben. Stack Overflow ist eine Frage-Antwort-Website, kein Code-Schreibdienst. Bitte [siehe hier] (http: // stackoverflow.com/help/how-to-ask), um zu lernen, wie man effektive Fragen schreibt und Code hinzufügt, der den aktuellen Versuch zeigt. – JGreenwell

+0

@JGreenwell Ich bin mir ziemlich sicher, dass es in Zeile oder zwei getan werden kann, aber ich bin kein Pandas-Experte. Ich habe eine Lösung, aber es ist keine Pandas. –

+3

Bitte nehmen Sie @ JGreenwells Kommentar ernst. Schritt Null, wenn Sie eine Frage zu SO stellen, zeigt Ihre eigenen Bemühungen. Während viele Leute gerne Ihre Arbeit für Sie erledigen, sollten Sie dies nicht missbrauchen, da dies für die Website ungesund ist. –

Antwort

3

Option 1

  • apply(pd.Series) Listen als Teil der Datenrahmen einzubetten
  • stack in einem überschaubaren Reihe zu bekommen
  • reset_index becaus e wird es eine lästige Artefakt aus Stapeln links vorbei
  • groupby + pd.TimeGrouper('D') + value_counts + head zu Job

df.animals.apply(pd.Series).stack() \ 
    .reset_index(1, drop=True) \ 
    .groupby(pd.TimeGrouper('D')) \ 
    .apply(lambda x: pd.value_counts(x).head(2)) 

Option 2

  • resample getan von 'D' dann sum auf alle Listen aus einem einzigen Tag kombinieren
  • value_counts
  • nlargest

df.animals.resample('D').sum() \ 
    .apply(pd.value_counts).stack() \ 
    .groupby(level=0, group_keys=False).nlargest(2) 

Option 3

  • list Verständnis Listen abzuflachen
  • numpy.unique eindeutige Werte und ihre Zählungen
  • numpy.argsort zu erhalten 2 größten Wert erhalten zählt
  • resample täglich und verwenden apply

def big2(s): 
    l = [i for l in s.values.tolist() for i in l] 
    u, c = np.unique(l, return_counts=True) 
    a = np.argsort(c)[-2:] 
    return pd.Series(c[a], u[a]) 

df.animals.resample('D').apply(big2) 

ergibt

2016-12-26 dog   3 
      cat   2 
2016-12-27 elephant 2 
      cat   2 
dtype: int64 

Timing

enter image description here

0

So etwas wie

df.resample('D').apply(lambda x: pd.concat(x.values).value_counts().iloc [:2]) 
+3

pandas resampling-Methode ist eigentlich eine saubere Methode für Frequenzkonvertierungen - so könnten Sie überlegen, eine Erklärung dafür, was dieser Code tut. – JGreenwell

Verwandte Themen