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.

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.