基于Python中的特定值拆分数据框

时间:2016-05-05 10:43:19

标签: python pandas

我有一个数据框如下:

Size    C1      C2      C3      C4      C5      C6      C7      C8      C9
10000   .90     1.10    1.30    1.50    2.10    3.10    5.60    8.40    15.80
15000   1.35    1.65    1.95    2.25    3.15    4.65    8.40    12.60   23.70
20000   1.80    2.20    2.60    3.00    4.20    6.20    11.20   16.80   31.60
25000   2.25    2.75    3.25    3.75    5.25    7.75    14.00   21.00   39.50
30000   2.70    3.30    3.90    4.50    6.30    9.30    16.80   25.20   47.40
35000   3.15    3.85    4.55    5.25    7.35    10.85   19.60   29.40   55.30
40000   3.60    4.40    5.20    6.00    8.40    12.40   22.40   33.60   63.20
45000   4.05    4.95    5.85    6.75    9.45    13.95   25.20   37.80   71.10
50000   4.50    5.50    6.50    7.50    10.50   15.50   28.00   42.00   79.00
10000   .60     .80     1.00    1.20    1.80    2.80    5.30    8.10    15.50
15000   .90     1.20    1.50    1.80    2.70    4.20    7.95    12.15   23.25
20000   1.20    1.60    2.00    2.40    3.60    5.60    10.60   16.20   31.00
25000   1.50    2.00    2.50    3.00    4.50    7.00    13.25   20.25   38.75
30000   1.80    2.40    3.00    3.60    5.40    8.40    15.90   24.30   46.50
35000   2.10    2.80    3.50    4.20    6.30    9.80    18.55   28.35   54.25
40000   2.40    3.20    4.00    4.80    7.20    11.20   21.20   32.40   62.00
45000   2.70    3.60    4.50    5.40    8.10    12.60   23.85   36.45   69.75
50000   3.00    4.00    5.00    6.00    9.00    14.00   26.50   40.50   77.50
1000    0.20    0.20    0.20    0.20    0.20    0.20    0.20    0.20    0.20
2000    0.39    0.39    0.39    0.39    0.39    0.39    0.39    0.39    0.39
3000    0.59    0.59    0.59    0.59    0.59    0.59    0.59    0.59    0.59
4000    0.78    0.78    0.78    0.78    0.78    0.78    0.78    0.78    0.78
5000    0.98    0.98    0.98    0.98    0.98    0.98    0.98    0.98    0.98
6000    1.17    1.17    1.17    1.17    1.17    1.17    1.17    1.17    1.17
7000    1.37    1.37    1.37    1.37    1.37    1.37    1.37    1.37    1.37
8000    1.56    1.56    1.56    1.56    1.56    1.56    1.56    1.56    1.56
9000    1.76    1.76    1.76    1.76    1.76    1.76    1.76    1.76    1.76
10000   1.95    1.95    1.95    1.95    1.95    1.95    1.95    1.95    1.95

现在我想根据'尺寸'

将它们分成3个数据帧

df1:从10000开始 - 下次出现10000之前 df2:第二万 - 1000之前 df3:从1000到结束

否则,在同一数据帧中有一个临时变量(临时列)可以分别指定上述范围内的S1,S2和S3等类别。

有人可以指导我如何解决这个问题吗?

此致

2 个答案:

答案 0 :(得分:3)

假设您希望打破减少,您可以使用compare-cumsum-groupby模式:

parts = list(df.groupby((df["Size"].diff() < 0).cumsum()))

给了我(在中间抑制无聊的行)

>>> for key, group in parts:
...     print(key)
...     print(group)
...     print("----")
...     
0
    Size    C1    C2    C3    C4     C5     C6    C7    C8    C9
0  10000  0.90  1.10  1.30  1.50   2.10   3.10   5.6   8.4  15.8
1  15000  1.35  1.65  1.95  2.25   3.15   4.65   8.4  12.6  23.7
2  20000  1.80  2.20  2.60  3.00   4.20   6.20  11.2  16.8  31.6
[...]
7  45000  4.05  4.95  5.85  6.75   9.45  13.95  25.2  37.8  71.1
8  50000  4.50  5.50  6.50  7.50  10.50  15.50  28.0  42.0  79.0
----
1
     Size   C1   C2   C3   C4   C5    C6     C7     C8     C9
9   10000  0.6  0.8  1.0  1.2  1.8   2.8   5.30   8.10  15.50
10  15000  0.9  1.2  1.5  1.8  2.7   4.2   7.95  12.15  23.25
11  20000  1.2  1.6  2.0  2.4  3.6   5.6  10.60  16.20  31.00
[...]
16  45000  2.7  3.6  4.5  5.4  8.1  12.6  23.85  36.45  69.75
17  50000  3.0  4.0  5.0  6.0  9.0  14.0  26.50  40.50  77.50
----
2
     Size    C1    C2    C3    C4    C5    C6    C7    C8    C9
18   1000  0.20  0.20  0.20  0.20  0.20  0.20  0.20  0.20  0.20
19   2000  0.39  0.39  0.39  0.39  0.39  0.39  0.39  0.39  0.39
20   3000  0.59  0.59  0.59  0.59  0.59  0.59  0.59  0.59  0.59
[...]
26   9000  1.76  1.76  1.76  1.76  1.76  1.76  1.76  1.76  1.76
27  10000  1.95  1.95  1.95  1.95  1.95  1.95  1.95  1.95  1.90
----

答案 1 :(得分:2)

不是很优雅,但这有效:

In [259]:
ranges=[]
first = df.index[0]
criteria = df.index[df['Size'].diff() < 0]
for idx in criteria:
    ranges.append((first, idx))
    first += idx
ranges

Out[259]:
[(0, 9), (9, 18)]

In [261]:
splits = []
for r in ranges:
    splits.append(df.iloc[r[0]:r[1]])
splits.append(df.iloc[ranges[-1][0]:])
splits

Out[261]:
[    Size    C1    C2    C3    C4     C5     C6    C7    C8    C9
 0  10000  0.90  1.10  1.30  1.50   2.10   3.10   5.6   8.4  15.8
 1  15000  1.35  1.65  1.95  2.25   3.15   4.65   8.4  12.6  23.7
 2  20000  1.80  2.20  2.60  3.00   4.20   6.20  11.2  16.8  31.6
 3  25000  2.25  2.75  3.25  3.75   5.25   7.75  14.0  21.0  39.5
 4  30000  2.70  3.30  3.90  4.50   6.30   9.30  16.8  25.2  47.4
 5  35000  3.15  3.85  4.55  5.25   7.35  10.85  19.6  29.4  55.3
 6  40000  3.60  4.40  5.20  6.00   8.40  12.40  22.4  33.6  63.2
 7  45000  4.05  4.95  5.85  6.75   9.45  13.95  25.2  37.8  71.1
 8  50000  4.50  5.50  6.50  7.50  10.50  15.50  28.0  42.0  79.0,
      Size   C1   C2   C3   C4   C5    C6     C7     C8     C9
 9   10000  0.6  0.8  1.0  1.2  1.8   2.8   5.30   8.10  15.50
 10  15000  0.9  1.2  1.5  1.8  2.7   4.2   7.95  12.15  23.25
 11  20000  1.2  1.6  2.0  2.4  3.6   5.6  10.60  16.20  31.00
 12  25000  1.5  2.0  2.5  3.0  4.5   7.0  13.25  20.25  38.75
 13  30000  1.8  2.4  3.0  3.6  5.4   8.4  15.90  24.30  46.50
 14  35000  2.1  2.8  3.5  4.2  6.3   9.8  18.55  28.35  54.25
 15  40000  2.4  3.2  4.0  4.8  7.2  11.2  21.20  32.40  62.00
 16  45000  2.7  3.6  4.5  5.4  8.1  12.6  23.85  36.45  69.75
 17  50000  3.0  4.0  5.0  6.0  9.0  14.0  26.50  40.50  77.50,
      Size    C1    C2    C3    C4    C5     C6     C7     C8     C9
 9   10000  0.60  0.80  1.00  1.20  1.80   2.80   5.30   8.10  15.50
 10  15000  0.90  1.20  1.50  1.80  2.70   4.20   7.95  12.15  23.25
 11  20000  1.20  1.60  2.00  2.40  3.60   5.60  10.60  16.20  31.00
 12  25000  1.50  2.00  2.50  3.00  4.50   7.00  13.25  20.25  38.75
 13  30000  1.80  2.40  3.00  3.60  5.40   8.40  15.90  24.30  46.50
 14  35000  2.10  2.80  3.50  4.20  6.30   9.80  18.55  28.35  54.25
 15  40000  2.40  3.20  4.00  4.80  7.20  11.20  21.20  32.40  62.00
 16  45000  2.70  3.60  4.50  5.40  8.10  12.60  23.85  36.45  69.75
 17  50000  3.00  4.00  5.00  6.00  9.00  14.00  26.50  40.50  77.50
 18   1000  0.20  0.20  0.20  0.20  0.20   0.20   0.20   0.20   0.20
 19   2000  0.39  0.39  0.39  0.39  0.39   0.39   0.39   0.39   0.39
 20   3000  0.59  0.59  0.59  0.59  0.59   0.59   0.59   0.59   0.59
 21   4000  0.78  0.78  0.78  0.78  0.78   0.78   0.78   0.78   0.78
 22   5000  0.98  0.98  0.98  0.98  0.98   0.98   0.98   0.98   0.98
 23   6000  1.17  1.17  1.17  1.17  1.17   1.17   1.17   1.17   1.17
 24   7000  1.37  1.37  1.37  1.37  1.37   1.37   1.37   1.37   1.37
 25   8000  1.56  1.56  1.56  1.56  1.56   1.56   1.56   1.56   1.56
 26   9000  1.76  1.76  1.76  1.76  1.76   1.76   1.76   1.76   1.76
 27  10000  1.95  1.95  1.95  1.95  1.95   1.95   1.95   1.95   1.95]

首先,这看起来大小何时停止增加:

df['Size'].diff() < 0

我们用来掩盖索引,然后迭代这些范围以创建元组范围列表。

我们迭代这些范围以在最后一步切片df。