Python Pandas: Wie man gruppierte Listen in einer Spalte als Dict zurückgibt

Python Pandas: Wie man alle Listen in einer Spalte in eine eindeutige Liste kompiliert

Beginnend mit Daten aus der vorherigen Frage:

f = pd.DataFrame({'id':['a','b', 'a'], 'val':[['val1','val2'], ['val33','val9','val6'], ['val2','val6','val7']]}) print (df) id val 0 a [val1, val2] 1 b [val33, val9, val6] 2 a [val2, val6, val7] 

Wie bekomme ich die Listen in Dict:

 pd.Series([a for b in df.val.tolist() for a in b]).value_counts().to_dict() {'val1': 1, 'val2': 2, 'val33': 1, 'val6': 2, 'val7': 1, 'val9': 1} 

Wie bekomme ich die Listen nach Gruppen:

df.groupby('id')["val"].apply(lambda x: (list([a for b in x.tolist() for a in b]))

 id a [val1, val2, val2, val6, val7] b [val33, val9, val6] Name: val, dtype: object 

Wie bekomme ich die Listen nach Gruppen als Dicts :

 df.groupby('id')["val"].apply(lambda x: pd.Series([a for b in x.tolist() for a in b]).value_counts().to_dict() ) 

Kehrt zurück:

 id a val1 1.0 val2 2.0 val6 1.0 val7 1.0 b val33 1.0 val6 1.0 val9 1.0 Name: val, dtype: float64 

Gewünschte Ausgabe Was verstehe ich? :

  id a {'val1': 1, 'val2': 2, 'val6': 2, 'val7': 1} b {'val33': 1, 'val6': 1, 'val9': 1} Name: val, dtype: object 

2 Solutions collect form web for “Python Pandas: Wie man gruppierte Listen in einer Spalte als Dict zurückgibt”

Bearbeitet mit agg von @ayhan (viel schneller als gelten).

 from collections import Counter df.groupby("id")["val"].agg(lambda x: Counter([a for b in x for a in b])) 

Aus:

 id a {'val2': 2, 'val6': 1, 'val7': 1, 'val1': 1} b {'val9': 1, 'val33': 1, 'val6': 1} Name: val, dtype: object 

Zeit dieser Version:

 %timeit df.groupby("id")["val"].agg(lambda x: Counter([a for b in x for a in b])) 1000 loops, best of 3: 820 µs per loop 

Zeit von @ayhan Version:

 %timeit df.groupby('id')["val"].agg(lambda x: pd.Series([a for b in x.tolist() for a in b]).value_counts().to_dict() ) 100 loops, best of 3: 1.91 ms per loo 

Bewerben ist flexibel. Wann immer es möglich ist, wandelt es das zurückkehrende Objekt in etwas, das mehr nutzbar ist. Aus den docs :

Einige Operationen auf den gruppierten Daten passen möglicherweise nicht in die Aggregat- oder Transformationskategorien. Oder Sie können einfach GroupBy ableiten, wie man die Ergebnisse kombiniert. Für diese verwenden Sie die Anwenden-Funktion, die sowohl Aggregat als auch Transformation in vielen Standard-Anwendungsfällen ersetzen kann.

Hinweis: Anwendung kann als Reduzierer, Transformator oder Filterfunktion dienen, je nachdem, was genau passiert ist. Also je nach dem Weg, und genau das, was du gruppierst. So können die gruppierten Spalten (s) in die Ausgabe aufgenommen werden und die Indizes setzen.

Es kann Fälle geben, so dass du dieses Verhalten vermeiden möchtest. Wenn Sie gruppieren, einfach ersetzen gelten mit agg:

 df.groupby('id')["val"].agg(lambda x: pd.Series([a for b in x.tolist() for a in b]).value_counts().to_dict() ) Out: id a {'val1': 1, 'val7': 1, 'val6': 1, 'val2': 2} b {'val6': 1, 'val33': 1, 'val9': 1} Name: val, dtype: object 
  • Pandas dataframe zu json ohne index
  • So sammeln Sie Proben in mehreren CSV-Dateien
  • Numpy hstack - "ValueError: alle Eingabe-Arrays müssen die gleiche Anzahl von Dimensionen haben" - aber sie tun
  • Pandas Importfehler beim Debuggen mit PVTS
  • Effizient die letzten 'n' Zeilen von CSV in DataFrame lesen
  • Pandas: Drop () int64 basierend auf value returns object
  • Wie konvertiere man Pandas-Index in einem Dataframe in eine Spalte?
  • Wie zu unterdrücken matplotlib Warnung?
  • Berechnungen in pandas dataframe auf der Grundlage der nachlaufenden Zeile
  • Python-Pandas nicht in der Lage, Zusammenfassung der großen Dataframe anzuzeigen
  • Vermeidung von wissenschaftlicher Notation in seaborn boxplot
  • Python ist die beste Programmiersprache der Welt.