Разделить фрейм данных на несколько фреймов на основе значения NaN - PullRequest
0 голосов
/ 28 февраля 2020

мой вопрос касается разделения фреймов данных на несколько фреймов данных. Исходный кадр данных показан в [ FIGURE_1 ]. Его следует разделить на определенное значение, например, NaN [ FIGURE_2 ].

В моем обычном кадре данных гораздо больше миллиона строк и 16 столбцов, поэтому мне нужно решение с оптимизированной производительностью, пожалуйста.

Мне срочно требуется разделение для последующей обработки.

FIGURE_1 текущий кадр данных

PacketID    TraceTime   Size
0   0.3948  --  --
1   0.3949  01.01.1970 00:12:39.298 77
2   0.3950  01.01.1970 00:12:39.298 80
3   0.3951  01.01.1970 00:12:39.315 81
4   0.3952  01.01.1970 00:12:39.335 78
5   0.3953  01.01.1970 00:12:39.335 71
.   .   .   .   .
.   .   .   .   .
395926  7.11074 01.01.1970 00:48:42.829 1666
395927  7.11075 01.01.1970 00:48:42.829 57
395928  7.11076 01.01.1970 00:48:42.851 57
395929  #----- END: log_0000.log: session #0        
395930  #----- BEGIN: log_0000.log: session #1      
395931  PacketID    TraceTime   Size
395932  7.14891 --  --
395933  7.14892 01.01.1970 00:00:19.313 80
395934  7.14893 01.01.1970 00:00:19.313 61
.   .   .   .   .
.   .   .   .   .
753533  13.19876    01.01.1970 00:31:56.374 60
753534  13.19877    01.01.1970 00:31:56.380 57
753535  13.19878    01.01.1970 00:31:56.380 57
753536  #----- END: log_0000.log: session #1        
753537  #----- BEGIN: log_0000.log: session #2      
753538  PacketID    TraceTime   Size
753539  13.23802    --  --
753540  13.23803    01.01.1970 00:00:48.777 17
753541  13.23804    01.01.1970 00:00:48.802 1
and so on...

FIGURE_2 требуемые кадры данных

df_1 = 
PacketID    TraceTime   Size
0   0.3948  --  --
1   0.3949  01.01.1970 00:12:39.298 77
2   0.3950  01.01.1970 00:12:39.298 80
.   .   .   .   .
.   .   .   .   .
395919  7.11067 01.01.1970 00:48:42.602 38
395920  7.11068 01.01.1970 00:48:42.602 54
395921  7.11069 01.01.1970 00:48:42.602 38
395922  7.11070 01.01.1970 00:48:42.629 57

df_2 =
395931  PacketID    TraceTime   Size
395932  7.14891 --  --
395933  7.14892 01.01.1970 00:00:19.313 80
395934  7.14893 01.01.1970 00:00:19.313 61
395935  7.14894 01.01.1970 00:00:19.313 110
.   .   .   .   .
.   .   .   .   .
753532  13.19875    01.01.1970 00:31:56.374 63
753533  13.19876    01.01.1970 00:31:56.374 60
753534  13.19877    01.01.1970 00:31:56.380 57
753535  13.19878    01.01.1970 00:31:56.380 57

df_3 = 
753538  PacketID    TraceTime   Size
753539  13.23802    --  --
753540  13.23803    01.01.1970 00:00:48.777 17
753541  13.23804    01.01.1970 00:00:48.802 1
and so on...

У меня уже есть опция [ FIGURE_3 ], но она устарела и будет удалена в будущем.

FIGURE_3

Python:
dense_ts = df['TraceTime']    
sparse_ts = dense_ts.to_sparse()
block_locs = zip(sparse_ts.sp_index.blocs, sparse_ts.sp_index.blengths)
blocks = [dense_ts.iloc[start:(start + length - 1)] for (start, length) in block_locs] 

Warning:
C:\Users\andre\Anaconda3\lib\site-packages\ipykernel_launcher.py:15: FutureWarning: Series.to_sparse is deprecated and will be removed in a future version from ipykernel import kernelapp as app

1 Ответ

0 голосов
/ 28 февраля 2020

Если ваш Dataframe нужно разделить на несколько групп подряд, содержащих все NaN, вот способ:

#create groups by comparing to null  
df['group'] = df.isnull().all(axis=1).cumsum() 

# Use dictionary comprehension together with loc to select the relevant group
d = {i: df.loc[df.group == i, ['PacketID', 'TraceTime','Size']] for i in range(1, df.group.iat[-1])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...