2015-05-13 136 views
2

我有一個擁有51034行和10列的熊貓數據框。我想根據包含要切片的行的列表將此數據幀分成158個較小的數據幀。在熊貓中將數據框分爲多個數據幀

如何將熊貓數據幀分割成更小的數據幀?

例如,如果我有10行和4列的數據幀:

 A B C D 
0  1 2 3 4 
1  5 6 7 8 
2  9 10 11 12 
3  13 14 15 16 
4  17 18 19 20 
5  21 22 23 24 
6  25 26 27 28 
7  29 30 31 32 
8  33 34 35 36 
9  37 38 39 40 

該實施例的數據幀將每2行切片以創建5個新的更小的數據幀:

DataFrame1: 

     A B C D 
0  1 2 3 4 
1  5 6 7 8 

DataFrame2: 

     A B C D 
0  9 10 11 12 
1  13 14 15 16 

DataFrame3: 

     A B C D 
0  17 18 19 20 
1  21 22 23 24 

DataFrame4: 

     A B C D 
0  25 26 27 28 
1  29 30 31 32 

DataFrame5: 

     A B C D 
0  33 34 35 36 
1  37 38 39 40 

我不確定如何使用更大的數據幀來創建更小的數據幀。

關於如何完成此目標的任何建議?

謝謝。

羅德里戈

回答

2

可以使用groupby用一個簡單的索引到組映射函數,假設索引是連續的,並從0開始:

for _, df_k in df.groupby(lambda x: x/2): 
    print df_k.reset_index(drop=True) 

輸出:

A B C D 
0 1 2 3 4 
1 5 6 7 8 
    A B C D 
0 9 10 11 12 
1 13 14 15 16 
    A B C D 
0 17 18 19 20 
1 21 22 23 24 
    A B C D 
0 25 26 27 28 
1 29 30 31 32 
    A B C D 
0 33 34 35 36 
1 37 38 39 40 

如果您有指示切片位置的數字列表,則可以傳遞字典作爲組映射:

import numpy as np 
slice_at = [3, 5] 
group_sizes = np.diff([0] + slice_at + [len(df)]) 
mapping = dict(zip(df.index, np.repeat(range(len(group_sizes)), group_sizes))) 
for _, df_k in df.groupby(mapping): 
    print df_k.reset_index(drop=True) 

輸出:

A B C D 
0 1 2 3 4 
1 5 6 7 8 
2 9 10 11 12 
    A B C D 
0 13 14 15 16 
1 17 18 19 20 
    A B C D 
0 21 22 23 24 
1 25 26 27 28 
2 29 30 31 32 
3 33 34 35 36 
4 37 38 39 40 
+0

由於YS-L。我沒有想到的一件事就是不打印子集數據幀,我怎樣才能爲每個子集創建新的數據幀變量? –

+1

您可以將子集DataFrames分配給某些變量,或將它們放入字典或列表中。它們是原始DataFrame的一部分的副本。 –