如果你有一只大熊猫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。
答案 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.split
或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