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