2016-11-10 3 views
0

У меня очень простой фрейм. Есть 2 столбца, day_created (int, может быть изменено на datetime) и приостановлено (int, может быть изменено на boolean). Я могу изменить данные, если это упростит работу.pandas - данные биннинга и получение 2 столбцов

 Day created Suspended 
0    12   0 
1    6   1 
2    24   0 
3    8   0 
4    100   1 
5    30   0 
6    1   1 
7    6   0 

day_created колонна является целым числом от дня счет был создан (от даты начала), начиная с 1 и увеличивается. Подвешенная колонна представляет собой 1 для подвески и 0 без суспензии.

Что бы я хотел сделать, это собрать эти учетные записи в группы по 30 дней или месяцев, но из каждого бина вы получите общее количество учетных записей за этот месяц и количество приостановленных аккаунтов, которые были созданы в этом месяце. Затем я планирую создать гистограмму с 2 барами за каждый месяц.

Как мне это сделать? Я часто не пользуюсь пандами. Я предполагаю, что мне нужно сделать некоторые трюки с пересчетом и подсчетом.

ответ

1

Использование

df.index = start_date + pd.to_timedelta(df['Day created'], unit='D') 

дать DataFrame индекс, представляющий отметки времени, когда были созданы учетные записи.

Затем вы можете использовать

result = df.groupby(pd.TimeGrouper(freq='M')).agg(['count', 'sum']) 

сгруппировать строки в DataFrame (по месяцам) в соответствии с проставлены в индексе. .agg(['count', 'sum']) вычисляет количество учетных записей (количество) и количество приостановленных учетных записей для каждой группы.

Затем result.plot(kind='bar', ax=ax) участки гистограмма:

import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame(
    {'Day created': [12, 6, 24, 8, 100, 30, 1, 6], 
    'Suspended': [0, 1, 0, 0, 1, 0, 1, 0]}) 
start_date = pd.Timestamp('2016-01-01') 
df.index = start_date + pd.to_timedelta(df['Day created'], unit='D') 

result = df.groupby(pd.TimeGrouper(freq='M'))['Suspended'].agg(['count', 'sum']) 
result = result.rename(columns={'sum':'suspended'}) 

fig, ax = plt.subplots() 
result.plot(kind='bar', ax=ax) 
locs, labels = plt.xticks() 
plt.xticks(locs, result.index.strftime('%Y-%m-%d')) 
fig.autofmt_xdate() 
plt.show() 

Урожайность enter image description here

+0

работает как шарм – Shatnerz

+0

я сделал, чтобы копаться в Matplotlib документы, но есть простой способ усечения чч: мм : ss из дат? – Shatnerz

+1

Я думаю, что самым простым способом было бы использовать 'plt.xticks' для установки новых ярлыков xtick. Я изменил код выше, чтобы показать, что я имею в виду. – unutbu

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