2017-11-09 4 views
1

pandas resampling関数については、DateTimeIndexを使用して知っています。Pandas DataFrame:n要素のグループによる整数インデックス/グループ分けによるリサンプリング

しかし、整数インデックスに沿ってどのように簡単に再サンプリング/グループ化できますか?

次のコードは、問題を示していると動作します:

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 

しかし、そこにこれを実現するために、よりエレガントな方法ではないでしょうか?

コードが少し重いようです。

ありがとうございます!

+0

https://stackoverflow.com/questions/37396264/pandas-equivalent-of-resample-for-integer-indexこれはあなたの問題を解決するかどうか確認してください:床でlenDataFrameのによって作成されたnumpy.arangeを割りました。今はテストする方法はありませんが、後でインデックスをリセットする必要があります。 :) – Manhattan

+0

私自身のアプローチはすでに簡単だと思う;-)。とにかくありがとう! –

答えて

1

です:

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

インデックスがない場合にはデフォルト(整数、一意)集合

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

両方のおかげで! –

0

インデックスの整数除算でgroup byを使用できます。すなわち

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

はコード

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) 

とあなたが床分裂指数とは、いくつかの機能を集約することができ、出力

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

お二人のおかげで! –

関連する問題