在Pandas / Python

时间:2015-10-10 15:38:21

标签: python pandas split

我是Python和Pandas的新手,所以请耐心等待。

我有一个看起来很像的大数据:

1       E                    1                  NaN
2       T  2004-09-21 01:15:53                  NaN
3       U                   30                  NaN
4       N                   32                  NaN
5       V                    1  2004-09-14 16:26:00
6       V                   -1  2004-09-14 16:53:00
7       V                    1  2004-09-14 17:08:00
...................................................
18      E                    1                  Nan
19      T  2004-10-21 02:13:43                  Nan
20      U                   35                  Nan
21      N                   40                  Nan
22      V                    1  2004-10-19 14:50:00
23      V                    1  2004-10-20 15:31:00
24      V                    1  2004-10-21 13:49:00
25      V                    1  2004-10-21 20:57:00
26      V                    1  2004-10-21 22:11:00
...................................................

如何将其拆分为单个小数据集,例如x(i),其中i=0,...,N,例如x(0),如下所示:

 1       E                    1                  NaN
 2       T  2004-09-21 01:15:53                  NaN
 3       U                   30                  NaN
 4       N                   32                  NaN
 5       V                    1  2004-09-14 16:26:00
 6       V                   -1  2004-09-14 16:53:00
 7       V                    1  2004-09-14 17:08:00
 ...................................................
 17      V                    1  2004-09-16 12:38:01

我想我应该使用一些循环命令从E转到E,但我不太确定如何将它分成单独的集合。

2 个答案:

答案 0 :(得分:1)

你可以在这里使用groupby,使用compare-cumsum-groupby模式(这里让我们说是带有Es的列被调用"字母"):

>>> grouped = df.groupby((df["letter"] == "E").cumsum())
>>> frames = [g for k,g in grouped]
>>> for frame in frames:
...     print(frame)
...     print("--")
...     
  letter
0      E
1      T
2      U
--
  letter
3      E
4      M
--
  letter
5      E
--
  letter
6      E
--

这是有效的,因为我们可以将所有内容与E进行比较,从而创建一系列布尔值:

>>> df["letter"] == "E"
0     True
1    False
2    False
3     True
4    False
5     True
6     True
Name: letter, dtype: bool

然后如果我们得到我们得到的累积总和

>>> (df["letter"] == "E").cumsum()
0    1
1    1
2    1
3    2
4    2
5    3
6    4
Name: letter, dtype: int32

每个新组都有自己的编号。阅读文档的split-apply-combine部分可能是一个好主意 - 如果您希望在组上执行的操作已经受支持,您可能甚至不需要将所有内容分解为子帧。

答案 1 :(得分:0)

您可以先找到具有该值的行的索引,然后您可以遍历它们并获取数据帧的切片:

def break_df_by(df, column, value):  
    ret = []
    indexes = df[df.ix[:, column] == value].index #[2, 5, 10] in the example below
    for n,i in enumerate(indexes):
        if n == 0: #if we want values before first 'E'
            ret.append(df[:i])
        elif n == len(indexes) - 1: #if we want values after last 'E'
            ret.append(df[i:])
        elif n > 0:
            ret.append(df[indexes[n-1]:i])

    return ret

一个例子,数据框是:

    1
0   T
1   V
2   E
3   T
4   V
5   E
6   T
7   U
8   N
9   V
10  E
11  T
12  U
13  N

结果:

break_df_by(df, 1, 'E')

[   1
 0  T
 1  V,    1
 2  E
 3  T
 4  V,    1
 5  E
 6  T
 7  U
 8  N
 9  V,     1
 10  E
 11  T
 12  U
 13  N]