2017-03-13 1 views
1

So habe ich einen großen Pandas Datenrahmen, die wie folgt strukturiert:Aufteilen einen Pandas Datenrahmen in kleinere Stücke auf Basis der Summe einer Spalte

x  y count 
blah blah 4 
blah blah 12 
blah blah 15 
... 

Die endgültige Summe der Zählspalte beträgt rund 48.000. Ich möchte den gesamten Datenrahmen in etwa zwölf verschiedene Teile aufteilen. Die Bedingung für diese Aufteilung ist, dass die Anzahl der Spalten in diesem Block ungefähr 4.000 betragen soll. Die Länge jedes Chunks kann also unterschiedlich sein, aber die Summe der Zählspalte muss bei etwa 4.000 liegen.

Gibt es eine schnelle und effiziente Möglichkeit, dies zu erreichen? Mein aktueller Versuch beinhaltet durch den Datenrahmen laufen und Anhängen bis die Summe der Zeilen 4000 überschreitet, aber es ist ziemlich langsam:

df_sum = 4000 

new_df = pd.DataFrame(columns=['x','y','count']) 

i = 1 

for index, row in df.iterrows(): 

    appended_sum = 0 

    if appended_sum < df_sum: 

     appended_sum += row['count'] 

     a_df.loc[len(a_df)] = row 

    else: 

     a_df.to_csv('split_'+str(i)+'.csv', index=False) 

     i+=1 

     a_df= a_df.iloc[0:0] 
     appended_sum = 0 

Antwort

1

als begrenztes Beispiel mit diesem Start:

 x  y count 
0 blah blah  4 
1 blah blah  12 
2 blah blah  15 
0 blah blah  4 
1 blah blah  12 
2 blah blah  15 
0 blah blah  4 
1 blah blah  12 
2 blah blah  15 

Diese funktionieren könnte:

df_sum = 30 
df['total'] = df['count'].cumsum() 
df['batch'] = (df['total']/df_sum).astype(int) 
grouped = df.groupby('batch') 
for group in grouped.groups.keys(): 
    data = grouped.get_group(group) 
    # do something with the data 
+0

Genau das, was ich brauchte! Vielen Dank. – GreenGodot

Verwandte Themen