2016-09-24 5 views
2

У меня есть гигантский DataFrame с столбцом типа даты и времени, а другой столбец типа float, называемый dist, кадр данных сортируется в зависимости от времени и расстояния. Я хочу разбить dataframe на несколько баз данных, основанных на монотонном увеличении dist.Pandas, split dataframe монотонным увеличением значения столбца

Split

dt     dist 
0 20160811 11:10  1.0 
1 20160811 11:15  1.4 
2 20160811 12:15  1.8 
3 20160811 12:32  0.6 
4 20160811 12:34  0.8 
5 20160811 14:38  0.2 

в

dt     dist 
0 20160811 11:10  1.0 
1 20160811 11:15  1.4 
2 20160811 12:15  1.8 

    dt     dist 
0 20160811 12:32  0.6 
1 20160811 12:34  0.8 

    dt     dist 
0 20160811 14:38  0.2 

ответ

5

Вы можете вычислить разницу вектор dist колонки, а затем сделать cumsum() при условии diff < 0 (это создает новый идентификатор каждый раз, когда dist уменьшается от предыдущего)

df['id'] = (df.dist.diff() < 0).cumsum() 

print(df) 

#    dt dist id 
#0 20160811 11:10 1.0 0 
#1 20160811 11:15 1.4 0 
#2 20160811 12:15 1.8 0 
#3 20160811 12:32 0.6 1 
#4 20160811 12:34 0.8 1 
#5 20160811 14:38 0.2 2 

for _, g in df.groupby((df.dist.diff() < 0).cumsum()): 
    print(g) 

#    dt dist 
#0 20160811 11:10 1.0 
#1 20160811 11:15 1.4 
#2 20160811 12:15 1.8 
#    dt dist 
#3 20160811 12:32 0.6 
#4 20160811 12:34 0.8 
#    dt dist 
#5 20160811 14:38 0.2 
1

вы можете сделать это с помощью метода: np.split()

In [92]: df 
Out[92]: 
        dt dist 
0 2016-08-11 11:10:00 1.0 
1 2016-08-11 11:15:00 1.4 
2 2016-08-11 12:15:00 1.8 
3 2016-08-11 12:32:00 0.6 
4 2016-08-11 12:34:00 0.8 
5 2016-08-11 14:38:00 0.2 

In [93]: dfs = np.split(df, df[df.dist.diff().fillna(0) < 0].index) 

In [94]: [print(x) for x in dfs] 
        dt dist 
0 2016-08-11 11:10:00 1.0 
1 2016-08-11 11:15:00 1.4 
2 2016-08-11 12:15:00 1.8 
        dt dist 
3 2016-08-11 12:32:00 0.6 
4 2016-08-11 12:34:00 0.8 
        dt dist 
5 2016-08-11 14:38:00 0.2 
Out[94]: [None, None, None] 

Объяснение:

In [97]: df.dist.diff().fillna(0) < 0 
Out[97]: 
0 False 
1 False 
2 False 
3  True 
4 False 
5  True 
Name: dist, dtype: bool 

In [98]: df[df.dist.diff().fillna(0) < 0] 
Out[98]: 
        dt dist 
3 2016-08-11 12:32:00 0.6 
5 2016-08-11 14:38:00 0.2 

In [99]: df[df.dist.diff().fillna(0) < 0].index 
Out[99]: Int64Index([3, 5], dtype='int64') 
Смежные вопросы