我正在尝试根据索引值或时间将一个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
答案 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)