根据时间或索引差异将DataFrame分成块

时间:2019-08-24 04:36:44

标签: python pandas

我正在尝试根据索引值或时间将一个DataFrame分成较小的DataFrame。如您在下面的示例中看到的,我的数据的时间分辨率为5分钟,并且当每行之间的时间差大于5分钟或索引大于1时,我想创建一个新的数据框(这是相同的条件,所以任何方法都可以。)

以下是我的数据示例:

Index    Time     Data
0        6:00      A
1        6:05      D
2        6:10      B
58       10:50     C
59       10:55     A
60       11:00     D
92       13:40     A
93       13:45     B

我想拥有以下内容:

拆分1:

Index    Time     Data
0        6:00      A
1        6:05      D
2        6:10      B

拆分2:

Index    Time     Data
58       10:50     C
59       10:55     A
60       11:00     D

拆分3:

Index    Time     Data
92       13:40     A
93       13:45     B

2 个答案:

答案 0 :(得分:1)

您必须创建一个类似于以下的助手系列:

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

然后,您可以将每个组存储在字典中,并调用dict的每个键以引用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)}

答案 1 :(得分:0)

另一种方法(基于先前关于stackoverflow的答案,现在无法找到链接)

META-INF/services/

然后您可以使用
访问单个组/数据框     group=[] for k,g in df.groupby(df['Index'] - np.arange(df.shape[0])): group.append(g)