在Pandas中将数据帧子集化为多个数据帧

时间:2015-05-13 04:20:02

标签: python list pandas dataframe

我有一个拥有51034行和10列的Pandas数据帧。我想根据包含要切片的行的列表将此数据帧切割成158个较小的数据帧。

如何将pandas数据帧切割成较小的数据帧?

例如,如果我有一个包含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

我不确定如何使用较大数据帧的切片来创建较小的数据帧。

有关如何实现这一目标的任何建议?

谢谢。

罗德里戈

1 个答案:

答案 0 :(得分: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