我是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
,但我不太确定如何将它分成单独的集合。
答案 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]