Normalisierung von Daten durch Duplizierung

Anmerkung: Diese Frage ist in der Tat ein Duplikat von Split Pandas Dataframe String Eintrag zu separaten Zeilen , aber die Antwort hier ist generischer und informativ, so mit allen Respekt fällig, entschied ich mich nicht, den Thread zu löschen


Ich habe einen "Dataset" mit folgendem Format:

id | value | ... --------|-------|------ a | 156 | ... b,c | 457 | ... e,g,f,h | 346 | ... ... | ... | ... 

Und ich möchte es normalisieren, indem du alle Werte für jedes ids duplizierst:

  id | value | ... --------|-------|------ a | 156 | ... b | 457 | ... c | 457 | ... e | 346 | ... g | 346 | ... f | 346 | ... h | 346 | ... ... | ... | ... 

Was ich tue, ist das Anwenden des Split-apply-Combine-Prinzips von pandas mit .groupby , das ein tuple für jede Gruppe erstellt (groupby value, pd.DataFrame())

Ich habe eine Spalte zu gruppieren, indem man einfach die IDs in der Reihe zählt:

 df['count_ids'] = df['id'].str.split(',').apply(lambda x: len(x)) id | value | count_ids --------|-------|------ a | 156 | 1 b,c | 457 | 2 e,g,f,h | 346 | 4 ... | ... | ... 

Die Art, wie ich die Zeilen dupliziere, ist wie folgt:

 pd.DataFrame().append([group]*count_ids) 

Ich bin langsam voran, aber es ist wirklich komplex, und ich würde schätzen jede Best Practice oder Empfehlung, die Sie mit dieser Art von Problemen teilen können.

  • Pandas (Python) Lesen und Arbeiten an Java BigInteger / große Zahlen
  • Wie mache ich eine Gruppe auf einem leeren Satz von Spalten in Pandas?
  • Wählen Sie aus dem Wörterbuch mit Pandas-Serie
  • Senkung der Prozesspriorität von multiprocessing.Pool auf Windows
  • Wie bekomme ich eine Liste aller doppelten Gegenstände mit Pandas in Python?
  • Warum erlauben keine Pandas, dass eine kategorische Spalte in Groupby verwendet wird?
  • One Solution collect form web for “Normalisierung von Daten durch Duplizierung”

    Versuche dies:

     In [44]: df Out[44]: id value 0 a 156 1 b,c 457 2 e,g,f,h 346 In [45]: (df['id'].str.split(',', expand=True) ....: .stack() ....: .reset_index(level=0) ....: .set_index('level_0') ....: .rename(columns={0:'id'}) ....: .join(df.drop('id',1), how='left') ....: ) Out[45]: id value 0 a 156 1 b 457 1 c 457 2 e 346 2 g 346 2 f 346 2 h 346 

    Erläuterung:

     In [48]: df['id'].str.split(',', expand=True).stack() Out[48]: 0 0 a 1 0 b 1 c 2 0 e 1 g 2 f 3 h dtype: object In [49]: df['id'].str.split(',', expand=True).stack().reset_index(level=0) Out[49]: level_0 0 0 0 a 0 1 b 1 1 c 0 2 e 1 2 g 2 2 f 3 2 h In [50]: df['id'].str.split(',', expand=True).stack().reset_index(level=0).set_index('level_0') Out[50]: 0 level_0 0 a 1 b 1 c 2 e 2 g 2 f 2 h In [51]: df['id'].str.split(',', expand=True).stack().reset_index(level=0).set_index('level_0').rename(columns={0:'id'}) Out[51]: id level_0 0 a 1 b 1 c 2 e 2 g 2 f 2 h In [52]: df.drop('id',1) Out[52]: value 0 156 1 457 2 346 
    Python ist die beste Programmiersprache der Welt.