2015-03-07 3 views
0

Я хочу создать отдельные кадры данных, где разница между 2 последовательными рядами не совсем 60.раскол dataframe на две или более частей

Из данных выборки, должен быть 2 dataframes (с 3-х строк в каждой)

from StringIO import StringIO 

myst="""905034, 'A', 'some value' 
905094, 'B', 'some other value' 
905154, 'C', 'some value other' 
43, 'x', 'some' 
103, 'y', 'value' 
163, 'z', 'some value' 
""" 
u_cols=['column1', 'column2', 'column3'] 

myf = StringIO(myst) 
import pandas as pd 
df = pd.read_csv(StringIO(myst), sep=',', names = u_cols) 

Есть ли способ разделить блок данных на несколько частей на основе функции или критерия?

ответ

1

Обычная картина является сравнение-cumsum-GroupBy, что-то вроде

>>> grouped = df.groupby((df.column1.diff() != 60).cumsum()) 
>>> for i, group in grouped: 
...  print("group #:", i) 
...  print(group) 
...  
group #: 1 
    column1 column2    column3 
0 905034  'A'   'some value' 
1 905094  'B' 'some other value' 
2 905154  'C' 'some value other' 
group #: 2 
    column1 column2  column3 
3  43  'x'   'some' 
4  103  'y'  'value' 
5  163  'z' 'some value' 

Это работает, потому что сравнение дает Правда каждый раз, когда начинается новая группа:

>>> df.column1.diff() != 60 
0  True 
1 False 
2 False 
3  True 
4 False 
5 False 
Name: column1, dtype: bool 

И то суммарная сумма которого дает номер идентификатора группы, мы можем перейти в качестве аргумента к groupby:

>>> (df.column1.diff() != 60).cumsum() 
0 1 
1 1 
2 1 
3 2 
4 2 
5 2 
Name: column1, dtype: int32 
+0

Это данные, генерируемые машиной. Бывают случаи, когда он печатает 59 или 61 секунд. Их следует рассматривать как 60. Я получаю слишком много данных, если настаиваю на 60-секундном интервале. Есть ли способ решить это? – shantanuo

+0

@shantanuo: вы просили «где разница между двумя последовательными строками не ровно 60». Разумеется, вы можете изменить условие 'df.column1.diff()! = 60' на все, что захотите. – DSM

+0

Да. Но когда я перепроверял фактические данные, я нашел несколько записей из 59. Так что я получил несколько кадров данных одиночных записей. Я пробовал ... # df.column1.diff() не в [59,60,61] #, но это не сработало. – shantanuo

Смежные вопросы