Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据列中连续出现的值将数据帧拆分为多个部分?_Python_Python 3.x_Pandas_Group By_Pandas Groupby - Fatal编程技术网

Python 如何根据列中连续出现的值将数据帧拆分为多个部分?

Python 如何根据列中连续出现的值将数据帧拆分为多个部分?,python,python-3.x,pandas,group-by,pandas-groupby,Python,Python 3.x,Pandas,Group By,Pandas Groupby,我有一个数据框,我在下面以表格格式表示。原始数据帧的大小要大得多,因此我无法在每一行上循环 col1 | col2 | col3 a x 1 b y 1 c z 0 d k 1 e l 1 我想要的是将其拆分为数据帧的子集,在列col3中具有连续数目的1s。 因此,理想情况下,我希望在数据帧上方返回两个数据帧df1和df2 df1 col1 | col2 | col3 a x 1 b

我有一个数据框,我在下面以表格格式表示。原始数据帧的大小要大得多,因此我无法在每一行上循环

col1 | col2 | col3
a      x     1
b      y     1
c      z     0
d      k     1
e      l     1
我想要的是将其拆分为数据帧的子集,在列
col3
中具有连续数目的
1
s。 因此,理想情况下,我希望在数据帧上方返回两个数据帧
df1
df2

df1

col1 | col2 | col3
a      x     1
b      y     1
df2

col1 | col2 | col3
d      k     1
e      l     1
是否有类似于
groupby
的方法来实现这一点? 如果我使用
groupby
,它将返回数据帧中所有4行
col3==1
。 我不希望这样,因为我需要两个数据帧,每个数据帧由连续出现的
1
s组成。
一种方法是按行循环,当我找到一个0时,我可以返回一个数据帧,但这不是有效的。感谢任何帮助。

首先通过
1
比较值,然后通过
shift
和累积和创建连续组,最后通过
groupby
获得所有组:

m1 = df['col3'].eq(1)
g = m1.ne(m1.shift()).cumsum()

dfs = [x for i, x in df[m1].groupby(g)]
print (dfs)
[  col1 col2  col3
0    a    x     1
1    b    y     1,   col1 col2  col3
3    d    k     1
4    e    l     1]

print (dfs[0])
  col1 col2  col3
0    a    x     1
1    b    y     1
如有必要,删除单个
1
行并添加
keep=False

print (df)
  col1 col2  col3
0    a    x     1
1    b    y     1
2    c    z     0
3    d    k     1
4    e    l     1
5    f    m     0
6    g    n     1 <- removed

m1 = df['col3'].eq(1)
g = m1.ne(m1.shift()).cumsum()

g = g[g.duplicated(keep=False)]
print (g)
0    1
1    1
3    3
4    3
Name: col3, dtype: int32

dfs = [x for i, x in df[m1].groupby(g)]
print (dfs)
[  col1 col2  col3
0    a    x     1
1    b    y     1,   col1 col2  col3
3    d    k     1
4    e    l     1]
打印(df)
col1 col2 col3
0 a x 1
1 b y 1
2cz0
三维k1
4 e l 1
5Fm0
6GN1