2017-11-09 1 views
1

Ich weiß über Pandas resampling Funktionen mit einem DateTimeIndex.Pandas DataFrame: Resampling entlang Ganzzahl Index/Gruppierung von Gruppen von N Elementen

Aber wie kann ich Resample/gruppieren Sie entlang eines ganzzahligen Indexes einfach?

Der folgende Code veranschaulicht das Problem und arbeitet:

import numpy as np 
import pandas as pd 


df = pd.DataFrame(np.random.randint(5, size=(10, 2)), columns=list('AB')) 
print(df) 

    A B 
0 3 2 
1 1 1 
2 0 1 
3 2 3 
4 2 0 
5 4 0 
6 3 1 
7 3 4 
8 0 2 
9 4 4 

# sum of n consecutive elements 
n = 3 
tuples = [(i, i+n-1) for i in range(0, len(df.index), n)] 
df_new = pd.concat([df.loc[i[0]:i[1]].sum() for i in tuples], 1).T 
print(df_new) 

    A B 
0 4 4 
1 8 3 
2 6 7 
3 4 4 

Aber ist nicht es eine elegantere Möglichkeit, dies zu erreichen?

Der Code scheint ein bisschen plump mir ..

Vielen Dank im Voraus!

+0

https://stackoverflow.com/questions/37396264/pandas-equivalent-of-resample-for-integer-index Überprüfen Sie, ob das Ihr Problem löst. Ich denke, es ist - im Moment nicht testen - aber Sie müssen Ihren Index danach zurücksetzen. :) – Manhattan

+0

Ich denke mein eigener Ansatz ist schon einfacher ;-). Danke trotzdem! –

Antwort

1

Sie können divide Index Boden und eine Funktion aggregieren:

df1 = df.groupby(df.index // n).sum() 

Wenn der Index nicht ist Standard (ganzzahlig, eindeutig) Aggregat von Boden geteilt numpy.arange erstellt von len von DataFrame:

df1 = df.groupby(np.arange(len(df)) // n).sum() 
+1

Danke an euch beide! –

0

Sie können group by für die ganzzahlige Division des Indexes mit n verwenden. dh

df.groupby(lambda i: i//n).sum() 

hier ist der Code

import numpy as np 
import pandas as pd 

n=3 
df = pd.DataFrame(np.random.randint(5, size=(10, 2)), columns=list('AB')) 

print('df:') 
print(df) 
res = df.groupby(lambda i: i//n).sum() 
print('using groupby:') 
print(res) 

tuples = [(i, i+n-1) for i in range(0, len(df.index), n)] 
df_new = pd.concat([df.loc[i[0]:i[1]].sum() for i in tuples], 1).T 
print('using your method:') 
print(df_new) 

und der Ausgang

df: 
    A B 
0 1 0 
1 3 0 
2 1 1 
3 0 4 
4 3 4 
5 0 1 
6 0 4 
7 4 0 
8 0 2 
9 2 2 
using groupby: 
    A B 
0 5 1 
1 3 9 
2 4 6 
3 2 2 
using you method: 
    A B 
0 5 1 
1 3 9 
2 4 6 
3 2 2 
+0

Danke an euch beide! –

Verwandte Themen