2017-04-24 9 views
2

Ich möchte einen Datenrahmen mit sich wiederholenden Reihen umformen. Die Daten stammen aus einer CSV-Datei, in der Datenblöcke wiederholt werden.Pandas, die sich wiederholende Reihen umformen

Als Beispiel:

Name  1st 2nd 
0 Value1  a1  b1 
1 Value2  a2  b2 
2 Value3  a3  b3 
3 Value1  a4  b4 
4 Value2  a5  b5 
5 Value3  a6  b6 

wird in umgeformt werden:

Name  1st 2nd 3rd 4th 
Value1 a1 b1 a4 b4 
Value2 a2 b2 a5 b5 
Value3 a3 b3 a6 b6 

Haben Sie irgendwelche Vorschläge, wie dies zu tun? Ich habe das schon gesehen thread, aber ich kann nicht sehen, wie dieser Ansatz zu meinem Problem zu übersetzen, wo es mehr als eine Spalte rechts von der Spalte, die groupby bearbeitet wird.

Antwort

3

Sie set_index und stack verwenden können, um zwei Spalten in eine, cumcount zu bekommen die neuen Spaltenbeschriftungen zu kombinieren, und pivot die Umgestaltung zu tun:

# Stack the 1st and 2nd columns, and use cumcount to get the new column labels. 
df = df.set_index('Name').stack().reset_index(level=1, drop=True).to_frame() 
df['new_col'] = df.groupby(level='Name').cumcount() 

# Perform a pivot to get the desired shape. 
df = df.pivot(columns='new_col', values=0) 

# Formatting. 
df = df.reset_index().rename_axis(None, 1) 

Die resultierende Ausgabe:

 Name 0 1 2 3 
0 Value1 a1 b1 a4 b4 
1 Value2 a2 b2 a5 b5 
2 Value3 a3 b3 a6 b6 
1

Erstellen Sie ein Datenframe mit wiederholten Werten von df nach dem Gruppieren nach Name und fusionieren Sie dieses df mit dem Original.

df1 = df.groupby('Name')['1st', '2nd'].apply(lambda x: x.iloc[1]).reset_index() 
df1.columns = ['Name', '3rd', '4th'] 
df = df.drop_duplicates(subset=['Name']).merge(df1, on = 'Name') 

Sie erhalten

Name 1st 2nd 3rd 4th 
0 Value1 a1 b1 a4 b4 
1 Value2 a2 b2 a5 b5 
2 Value3 a3 b3 a6 b6