2013-03-12 105 views
2

如果你有一只熊猫DataFrame({'a':[1,2,3,4,5,6,7,8,9]})有没有简单的方法将它分组为3个或任意数量的组?熊猫数据框组由多行

我知道这可以通过添加一个包含允许分组的值的额外列来完成,例如,您可以将上述数据框加入[1,1,1,2,2,2,3,3,3],并通过添加列加入group。但似乎应该不需要为此操作添加额外的列。

另外,我可以创建一个索引数组并循环使用它们作为DataFrame.ix []的参数的数组值,但对于大型DataFrame而言似乎并不快。

我错过了一个更简单的方法吗?

== ==方案

从下面我的首选解决方案的答案是使用numpy.array_split(如果一个不平等分工不同numpy.split使它不会引发异常),您还可以通过要分割的索引数组而不是所需的结果数量。与线下面你可以分割一个数据帧(DF)为x行

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

的split_df小DataFrames是一个列表,其中所述第一对象是一个空numpy的阵列与以下对象是分裂DataFrames。

回答

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 
+0

谢谢,我之前没有注意到np.split。 – seumas 2013-03-13 09:42:08

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 
+0

谢谢,这是一个很好的答案对于示例DataFrame和将groupby与标准索引一起使用。我使用的较大的DataFrame往往有一个DateTimeIndex。 – seumas 2013-03-13 09:54:39

+0

@seumas:在这种情况下,你可以调用'df.reset_index()',它会给你一个带有线性索引的数据框,并且你以前的DateTimeIndex成为一列(除非你使用'.reset_index(drop = True)'' ) – LeoRochael 2017-01-05 13:50:18