pandas数据帧组由多行组成

时间:2013-03-12 23:28:23

标签: python numpy pandas

如果你有一只大熊猫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行的较小DataFrame

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

split_df是一个列表,其中第一个对象是空的numpy数组,以下对象是拆分的DataFrame。

2 个答案:

答案 0 :(得分:7)

根据您的示例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

答案 1 :(得分:2)

以下是另一种使用numpy.splitnumpy.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