2013-03-12 97 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