2016-07-15 12 views
2

Ich habe einen Pandas-Datenrahmen mit 600 Spalten (df1), und ich möchte die Werte jeder Spalte in Gruppen von 6 summieren. Mit anderen Worten, ich möchte einen neuen Datenrahmen erstellen (df2) mit 100 Spalten, wobei jede Spalte die Summe von 6 Spalten des Eingabedatenrahmens darstellt. Beispiel: Jede Zeile Die erste Spalte in df2 ist die Summe der ersten sechs Spalten in df1 (wobei die Zeilen getrennt bleiben). Der Datenrahmen ich auch bin mit hat String-Werte für jeden Spaltennamen (hier nur mit einzelnen Buchstaben dargestellt)Gruppen von Spalten innerhalb eines Pandas Datareframe summieren

Für df1:

 A B C D E F G H I J ... 
0  9 6 3 4 7 7 6 0 5 2 ...  
1  8 0 6 6 0 5 6 5 8 7 ...   
2  9 0 7 2 9 5 3 2 1 7 ...    
3  5 2 9 6 7 0 3 8 5 0 ...    
4  7 1 0 7 4 0 2 0 5 8 ...  
5  0 9 2 0 4 9 5 7 6 2 ...  

ich die erste Spalte von DF2 möchte sein:

A G ... 
0 36 
1 25 
2 32 
3 29 
4 19 
5 24 

Dabei ist jede Zeile die Summe der ersten sechs Spalten dieser Zeile. Die nächste Spalte wäre dann die Summe der nächsten sechs Spalten und so weiter, wobei der Spaltenname der Name der ersten Spalte in jedem Satz von 6 ist. (Der erste Spaltenname ist der erste Spaltenname, der zweite Spaltenname ist der siebte Spalten, etc.)

Ich habe versucht, die Spaltenindizes zu verwenden, um die richtigen Spalten zu summieren, aber ich habe Probleme, einen Weg zu finden, die Summen in neuen Spalten mit relevanten Namen zu speichern.

Gibt es einen pythonischen Weg, um diese Spalten zu erstellen, und Spaltennamen aus DF in DF2 ziehen?

Antwort

2

können Sie groupby von Spalten (axis=1) mit angelegten Gruppen von df.columns //6 und sum:

print (df) 
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 
0 9 6 3 4 7 7 6 0 5 2 2 3 7 2 
1 8 0 6 6 0 5 6 5 8 7 9 5 5 1 
2 9 0 7 2 9 5 3 2 1 7 5 9 6 6 
3 5 2 9 6 7 0 3 8 5 0 8 8 9 9 
4 7 1 0 7 4 0 2 0 5 8 2 4 4 1 
5 0 9 2 0 4 9 5 7 6 2 7 1 5 3 

#if values of columns are not int 
#df.columns = df.columns.astype(int) 
print (df.columns // 6) 
Int64Index([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2], dtype='int64') 

print (df.groupby(df.columns // 6, axis=1).sum()) 
    0 1 2 
0 36 18 9 
1 25 40 6 
2 32 27 12 
3 29 32 18 
4 19 21 5 
5 24 28 8 

EDIT:

Sie können erstellen Index von range und shape (Länge der Spalten erhalten), und es verwenden, in groupby:

idx = pd.Index(range(df.shape[1])) // 6 
print (idx) 
Int64Index([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2], dtype='int64') 

df1 = df.groupby(idx, axis=1).sum() 
#if need rename columns by categories 
df1.columns = df.columns[::6] 
print (df1) 
    A G M 
0 36 18 9 
1 25 40 6 
2 32 27 12 
3 29 32 18 
4 19 21 5 
5 24 28 8 
+0

Die Problem mit dieser Lösung ist, dass die Spaltennamen Strings (Namen von Kategorien) sind, also glaube ich nicht, dass ich den Etagenunterteilungsoperator verwenden kann, um die Gruppen zu trennen. Ich werde meinen Beitrag bearbeiten, damit dies klarer wird. – Nizag

+0

Ihre Bearbeitung hat es geschafft! Ich schaue jetzt in die pd.Index-Funktionen sowie die Dataframe-Shape-Funktion, um ein besseres Verständnis dafür zu bekommen, wie das funktioniert. Vielen Dank! – Nizag

+0

Froh kann dir helfen. Ich füge auch neue Spalten zu Kategorienamen hinzu. – jezrael