2016-03-31 6 views
0

Das erste Problem ist das folgende: Ich habe eine Ausgangsmatrix mit etwa 10 Zeilen und 12 Zeilen. Für alle Linien möchte ich zwei Reihen zusammenfassen. Am Ende muss ich 10 Zeilen haben, aber mit nur 6 Zeilen. Derzeit bin ich die folgende for-Schleife in Python (mit Anfangs die eine Pandas Dataframe ist) tunVereinfachung der Routine in Python mit numpy Array oder Pandas

for i in range(0,12,2): 
    coarse[i]=initial.iloc[:,i:i+1].sum(axis=1) 

In der Tat bin ich ziemlich sicher, dass etwas effizienter möglich ist. Ich denke etwas wie Listenverständnis, aber für einen DataFrame oder ein numpy Array. Hat jemand eine Idee?

Darüber hinaus möchte ich wissen, ob es besser ist, große numpy Arrays oder Pandas DataFrame zu manipulieren.

+0

Könnten Sie eine repräsentative Probe entnommen Eingang hinzufügen? – Divakar

+0

Ein Datenrahmen hat Zeilen und Spalten. Ich nehme an, dass Ihr Verweis auf "Zeilen" oben tatsächlich Spalten war, weil Sie Zeilen explizit erwähnten. Der obige Beispielcode fügt jedoch Spaltenpaare hinzu. – Alexander

Antwort

1

Lassen Sie sich einen kleine Probe Datenrahmen erstellen, die Lösung zu veranschaulichen:

np.random.seed(0) 
df = pd.DataFrame(np.random.rand(6, 3)) 

>>> df 
      0   1   2 
0 0.548814 0.715189 0.602763 
1 0.544883 0.423655 0.645894 
2 0.437587 0.891773 0.963663 
3 0.383442 0.791725 0.528895 
4 0.568045 0.925597 0.071036 
5 0.087129 0.020218 0.832620 

Sie Slice-Notation aus der ersten Reihe (::2) und ausgehend von der zweiten Startreihe jede zweite Zeile wählen (1::2). iloc ist für Ganzzahlindizierung. Sie müssen die Werte an diesen Positionen auswählen und sie zusammenfügen. Das Ergebnis ist ein numpliges Array, das Sie bei Bedarf wieder in einen DataFrame konvertieren können.

Sie verwenden Werte, um die Indizierung zu entfernen. Dies ist, was passiert, sonst:

>>> df.iloc[::2] + df.iloc[1::2].values 
      0   1   2 
0 1.093697 1.138844 1.248657 
2 0.821029 1.683498 1.492558 
4 0.655174 0.945815 0.903656 

>>> df.iloc[::2].values + df.iloc[1::2] 
      0   1   2 
1 1.093697 1.138844 1.248657 
3 0.821029 1.683498 1.492558 
5 0.655174 0.945815 0.903656 

Für eine allgemeinere Lösung:

df = pd.DataFrame(np.random.rand(9, 3)) 
n = 3 # Number of consecutive rows to group. 
df['group'] = [idx // n for idx in range(len(df.index))] 

df.groupby('group').sum() 
       0   1   2 
group        
0  1.531284 2.030617 2.212320 
1  1.038615 1.737540 1.432551 
2  1.695590 1.971413 1.902501 
+0

Vielen Dank für Ihre Antwort, das Problem ist, dass ich diese Operation viele Male für unterschiedliche Größe der "Umgruppierungssumme" wiederholen muss. Zum Beispiel kann meine Matrix 15 Zeilen und 3 Spalten haben. Dann muss ich zuerst die Summe der Zeilen berechnen, gruppiert nach 3 (row0 + row1 + row2, dann row3 + row4 + row5 ... bis zu den 3 letzten Zeilen); zu einem zweiten Mal möchte ich die Operation wiederholen, aber die Zeilen um 5 gruppieren (row0 + ... + row4; ...; row10 + ... + row14). Ich hoffe ich bin klar genug! Kennst du eine Methode schneller als die, die ich vorgeschlagen habe und für die ich die Gruppierungsgröße leicht anpassen kann? – orpheu

+0

Siehe oben Bearbeiten. – Alexander

+0

Vielen Dank Alexander. Nur eine letzte Frage: Kannst du mir erklären, was "idx // n" bedeutet oder mir eine Webseite geben, die das erklärt? – orpheu

Verwandte Themen