2017-02-18 12 views
0

Так что я в CSV, который выглядит следующим образом:Получение число вхождений в год

  IncidntNum  Category  Date      
1   150098210  ROBBERY  02/03/2011 12:00:00 AM    
2   150098210  ASSAULT  07/05/2013 12:00:00 AM 
4   150098226  VANDALISM  12/01/2015 12:00:00 AM 
7   150098248  VANDALISM  04/06/2015 12:00:00 AM 

И я заинтересован в выяснении, сколько раз определенное преступление происходит каждый год, так что я бы, например, быть в состоянии составить график для каждого вида преступлений, показывая, сколько раз это преступление происходило каждый год. Как мне это сделать? Я немного потерялся на шагах, чтобы получить там честность.

До сих пор я импортировал CSV-файл и приводил в соответствие количество преступлений, которые просто происходят и накладываются на график, показывающий мне события каждого типа преступлений.

with open("file.csv", 'r') as f: 
    data = pd.read_csv(f) 

    crimes = data.loc[data['Category'] == x] 
    crimes_dates = crimes['Date'] 
    crimes_year = crimes_dates.apply(lambda x: x[6:10]).value_counts().sort_index() 
    unique_crimes_years = crimes_year.value_counts() 
    unique_crimes_years.plot(kind='bar') 
    plt.ylabel("Crimes count") 
    plt.show() 

Что хорошо и все, но я хотел бы, чтобы быть в состоянии выбрать определенное преступление и сюжет, сколько раз, что преступность происходит каждый год.

crimes = data.loc[data['Category'] == 'VANDALISM' 

Это принесите мне новый DataFrame похожий на data с, но только с «ВАНДАЛИЗМОМ», но я немного застрял о том, как я могу построить его по отношению к году?

EDIT:

Как предложил Генри, извлекая год, а затем рассчитывает на год была добавлена ​​и предпринята попытка графически.

EDIT 2:

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

+1

экстракта год от строки даты, а затем подсчитывается по годам. – Henry

+0

Это, по-видимому, важный шаг в правильном направлении, но есть ли другой способ, чем использование 'value_counts()', поскольку он, кажется, сортирует по вхождению, так что год с наименьшими появлениями слева, поднимаясь вверх, тогда как я «Мне нравится сортировать по году вместо этого? – Khaine775

+0

честно, id лично preproc, что в SQL! – Henry

ответ

2

Вы хотели бы использовать groupby и рассчитывать, имея дату, как ваш индекс:

В

df['Date']=pd.to_datetime(df['Date']) 
df.set_index('Date') 
df.groupby(df.index.year).count() 

Out

 IncidntNum Category 
2011   1   1 
2013   1   1 
2015   2   2 

Участок:

df.groupby(df.index.year).count()['IncidntNum'].plot(kind='bar') 

enter image description here

Если вы хотите, чтобы они сгруппированы по как категории и год:

df.groupby([df.index.year,'Category']).count()['IncidntNum'].plot(kind='bar') 

enter image description here

Давайте бросать в разборках стопки для хорошей меры:

df.groupby([df.index.year,'Category']).count()['IncidntNum'].unstack().plot(kind='bar') 

enter image description here