2015-09-03 4 views
1

Как мне группировать по кадру данных на основе первого столбца после разделения данных на двоеточие? В этом примере мне нужно разделить на последнее время столбца и группу за часом.Нарезка по группам по

from StringIO import StringIO 

myst="""india, 905034 , 19:44 
USA, 905094 , 19:33 
Russia, 905154 , 21:56 

""" 
u_cols=['country', 'index', 'current_tm'] 

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

Этот запрос не возвращает ожидаемые результаты:

df[df['index'] > 900000].groupby([df.current_tm]).size() 

current_tm 
    21:56  1 
19:33  1 
19:44  1 
dtype: int64 

Оно должно быть:

21 1 
19 2 

Время в формате чч: мм, но панды рассматривать его как строку.

Есть ли какая-нибудь утилита, которая преобразует SQL-запрос в эквивалент pandas? (Что-то вроде querymongo.com, который поможет пользователям MongoDB)

+0

Ваш df неверен, у вас есть встроенные пространства в столбце current_tm: 'В [109]: current_tm df ['current_tm']. Tolist() Out [109]: ['19:44', '19:33', '21:56'] 'Вам нужно исправить это, а затем вы можете начните думать о получении часового компонента – EdChum

ответ

1

Вы можете добавить час к вашему dataframe следующим а затем использовать его для группировки:

df['hour'] = df.current_tm.str.strip().apply(lambda x: x.split(':')[0] if isinstance(x, str) 
                 else None) 

>>> df[df['index'] > 900000].groupby('hour').size() 
hour 
19  2 
21  1 
dtype: int64 
1

Создать новую колонку:

df['hour'] = [current_time.split(':')[0] for current_time in df['current_tm']] 

затем применить свой метод:

df[df['index'] > 900000].groupby([df['hour']]).size() 

hour 
19 2 
21 1 
dtype: int64 
Смежные вопросы