3

パンダを飼っている場合DataFrame({'a':[1,2,3,4,5,6,7,8,9]})、それを 3 つまたは任意の数のグループにグループ化する簡単な方法はありますか?

これは、グループ化を可能にする値を含む追加の列を追加することで実行できることを理解しています。たとえば、上記の DataFrame を結合して、[1,1,1,2,2,2,3,3,3]追加した列でグループ化できます。しかし、この操作のために余分な列を追加する必要はないようです。

また、インデックスの配列を作成し、np.linspace(0,9,4)それらを DataFrame.ix[] のパラメーターとして使用して配列値をループすることもできますが、大きな DataFrame では高速ではないようです。

もっと簡単な方法がありませんか?

==解決策==

以下の回答から、私の好ましい解決策はnumpy.array_splitを使用することです( numpy.split とは異なり、不等分割が行われた場合は例外は発生しません)、結果の数ではなく分割するインデックスの配列を渡すこともできます必要な部分。以下の行を使用すると、DataFrame (df) を x 行の小さな DataFrames に分割できます。

split_df = np.array_split(df, np.arange(0, len(df),x))

split_df は、最初のオブジェクトが空の numpy 配列であり、次のオブジェクトが分割された DataFrame であるリストです。

4

2 に答える 2

9

あなたの例に基づいてDataFrame

In [25]: df.index/3
Out[25]: Int64Index([0, 0, 0, 1, 1, 1, 2, 2, 2], dtype=int64)

In [26]: for k,g in df.groupby(df.index/3):
    ...:     print k,g
    ...:     
0    a
0  1
1  2
2  3
1    a
3  4
4  5
5  6
2    a
6  7
7  8
8  9
于 2013-03-12T23:49:21.940 に答える
3

numpy.splitorを使用する別の方法を次に示しますnumpy.array_split

df = pd.DataFrame({"A":np.arange(9), "B":np.arange(10, 19)}, 
                  index=np.arange(100, 109))
for tmp in np.split(df, 3):
    print tmp

出力は次のとおりです。

     A   B
100  0  10
101  1  11
102  2  12
     A   B
103  3  13
104  4  14
105  5  15
     A   B
106  6  16
107  7  17
108  8  18
于 2013-03-13T01:56:32.450 に答える