基于连续行值差异拆分数据帧

2024-03-29 11:12:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据框

df
col1    col2    col3
 1        2      3
 2        5      6
 7        8      9
10       11     12
11       12     13
13       14     15
14       15     16

现在,当两个连续行的col1差大于1时,我想从上面创建多个数据帧。 因此,结果数据帧将如下所示:

df1
col1    col2    col3
 1        2      3
 2        5      6
df2
col1    col2    col3
 7        8      9
df3
col1    col2    col3
10       11     12
11       12     13
df4
col1    col2    col3
13       14     15
14       15     16

我可以使用for循环和存储索引来实现这一点,但这将增加执行时间,寻找一些快捷方式或python方式来最有效地实现这一点


Tags: 数据dffor方式时间col2col3col1
2条回答

您还可以剥离目标列并将其作为一个系列处理,而不是上面的答案。这使一切都变得更小。在这个示例中,它运行得更快,但我不知道它们将如何扩展,这取决于拆分的次数

row_bool = df['col1'].diff()>1
split_inds, = np.where(row_bool)
split_inds = np.insert(arr=split_inds, obj=[0,len(split_inds)], values=[0,len(df)])

df_tup = ()
for n in range(0,len(split_inds)-1):
    tempdf = df.iloc[split_inds[n]:split_inds[n+1],:]
    df_tup.append(tempdf)

(只是在之后将其放入数据帧的元组中,但字典方法可能更好?)

您可以通过取^{},检查它何时大于1,并取布尔序列的^{}来定义自定义grouper。然后根据结果分组并从groupby对象构建字典:

d = dict(tuple(df.groupby(df.col1.diff().gt(1).cumsum())))

print(d[0])
   col1  col2  col3
0     1     2     3
1     2     5     6

print(d[1])
   col1  col2  col3
2     7     8     9

更详细的细分:

df.assign(difference=(diff:=df.col1.diff()), 
          condition=(gt1:=diff.gt(1)), 
          grouper=gt1.cumsum())

   col1  col2  col3  difference  condition  grouper
0     1     2     3         NaN      False        0
1     2     5     6         1.0      False        0
2     7     8     9         5.0       True        1
3    10    11    12         3.0       True        2
4    11    12    13         1.0      False        2
5    13    14    15         2.0       True        3
6    14    15    16         1.0      False        3

相关问题 更多 >