pstaeubs
pstaeubs

Reputation: 17

Python - How to make a bar chart from csv file when the data is not numeric

I have a csv file with data that I have imported into a dataframe. 'RI_df = pd.read_csv("../Week15/police.csv")'

Using .head() my data looks like this:

state   stop_date   stop_time   county_name driver_gender   driver_race violation_raw   violation   search_conducted    search_type stop_outcome    is_arrested stop_duration   drugs_related_stop  district
0   RI  2005-01-04  12:55   NaN M   White   Equipment/Inspection Violation  Equipment   False   NaN Citation    False   0-15 Min    False   Zone X4
1   RI  2005-01-23  23:15   NaN M   White   Speeding    Speeding    False   NaN Citation    False   0-15 Min    False   Zone K3
2   RI  2005-02-17  04:15   NaN M   White   Speeding    Speeding    False   NaN Citation    False   0-15 Min    False   Zone X4
3   RI  2005-02-20  17:15   NaN M   White   Call for Service    Other   False   NaN Arrest Driver   

RI_df.head().to_dict()

Out[55]:
{'state': {0: 'RI', 1: 'RI', 2: 'RI', 3: 'RI', 4: 'RI'},
 'stop_date': {0: '2005-01-04',
  1: '2005-01-23',
  2: '2005-02-17',
  3: '2005-02-20',
  4: '2005-02-24'},
 'stop_time': {0: '12:55', 1: '23:15', 2: '04:15', 3: '17:15', 4: '01:20'},
 'county_name': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan},
 'driver_gender': {0: 'M', 1: 'M', 2: 'M', 3: 'M', 4: 'F'},
 'driver_race': {0: 'White', 1: 'White', 2: 'White', 3: 'White', 4: 'White'},
 'violation_raw': {0: 'Equipment/Inspection Violation',
  1: 'Speeding',
  2: 'Speeding',
  3: 'Call for Service',
  4: 'Speeding'},
 'violation': {0: 'Equipment',
  1: 'Speeding',
  2: 'Speeding',
  3: 'Other',
  4: 'Speeding'},
 'search_conducted': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'search_type': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan},
 'stop_outcome': {0: 'Citation',
  1: 'Citation',
  2: 'Citation',
  3: 'Arrest Driver',
  4: 'Citation'},
 'is_arrested': {0: False, 1: False, 2: False, 3: True, 4: False},
 'stop_duration': {0: '0-15 Min',
  1: '0-15 Min',
  2: '0-15 Min',
  3: '16-30 Min',
  4: '0-15 Min'},
 'drugs_related_stop': {0: False, 1: False, 2: False, 3: False, 4: False},
 'district': {0: 'Zone X4',
  1: 'Zone K3',
  2: 'Zone X4',
  3: 'Zone X1',
  4: 'Zone X3'}}

I am trying to break down the traffic violations by the driver_gender

ax = RI_df['violation'].value_counts().plot(kind='bar',
                                    figsize=(10,8),
                                    title="Offenses by gender")
ax.set_xlabel("Violation")
ax.set_ylabel("Freq")

I have this however this does not break it apart by gender. I think I need a subplot somewhere but I'm having trouble creating it. Should I make a smaller dataframe, for males and females and just make two graphs?

Upvotes: 1

Views: 97

Answers (1)

Quang Hoang
Quang Hoang

Reputation: 150785

You can try:

ax = (RI_df.groupby('driver_gender')
           .violation.value_counts()
           .unstack('violation', fill_value=0)
           .plot.bar(figsize=(10,8), title='violation by gender' )
     )

Output (random data):

enter image description here

Or:

ax = (RI_df.groupby('violation')
           .driver_gender.value_counts()
           .unstack('driver_gender', fill_value=0)
           .plot.bar(figsize=(10,8), title='violation by gender' )
     )

output:

enter image description here

Upvotes: 1

Related Questions