为了账号安全,请及时绑定邮箱和手机立即绑定

根据时间或索引差异将 DataFrame 拆分为 Chunks

根据时间或索引差异将 DataFrame 拆分为 Chunks

慕田峪4524236 2022-05-11 17:09:53
我正在尝试根据索引值或时间将 DataFrame 分成更小的 DataFrame。正如您在下面的示例中看到的,我的数据的时间分辨率是 5 分钟,我想在每行之间的时间差大于 5 分钟,或者索引增长超过 1 时创建一个新的数据帧(这是相同的标准,所以任何都可以)。这是我的数据示例:Index    Time     Data0        6:00      A1        6:05      D2        6:10      B58       10:50     C59       10:55     A60       11:00     D92       13:40     A93       13:45     B我想拥有以下内容:拆分 1:Index    Time     Data0        6:00      A1        6:05      D2        6:10      B拆分 2:Index    Time     Data58       10:50     C59       10:55     A60       11:00     D拆分 3:Index    Time     Data92       13:40     A93       13:45     B
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您必须创建一个辅助系列,例如:


s=df.index.to_series().diff().fillna(1).ne(1).cumsum()

print(s)

Index

0     0

1     0

2     0

58    1

59    1

60    1

92    2

93    2

然后您可以将每个组存储在字典中并调用字典的每个键来引用 df:


d={f'df_{i}':g for i,g in df.groupby(s)}

print(d['df_0'])

print('\n')

print(d['df_1'])

print('\n')

print(d['df_2'])

       Time Data

Index           

0      6:00    A

1      6:05    D

2      6:10    B



        Time Data

Index            

58     10:50    C

59     10:55    A

60     11:00    D



        Time Data

Index            

92     13:40    A

93     13:45    B

另一种使用方式more_itertools:


from more_itertools import consecutive_groups

indices=[[*i] for i in consecutive_groups(df.index)]

#[[0, 1, 2], [58, 59, 60], [92, 93]]

d2={f'df_{e}':df.loc[i] for e,i in enumerate(indices)}


查看完整回答
反对 回复 2022-05-11
?
莫回无

TA贡献1865条经验 获得超7个赞

另一种方法(基于stackoverflow上的早期答案,现在找不到链接)


group=[]

for k,g in df.groupby(df['Index'] - np.arange(df.shape[0])):

    group.append(g)

然后,您可以使用

group[0], group[1] or group[2]


查看完整回答
反对 回复 2022-05-11
  • 2 回答
  • 0 关注
  • 283 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号