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 行的较小 DataFrame

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 回答