PANDAS: группируйте категориальные переменные по месяцам, фильтрам и графику - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь сгруппировать набор категориальных переменных в месяц, отфильтровать их значения и отобразить эти переменные и значения, но у меня есть некоторые сомнения относительно того, как это сделать.У меня следующие проблемы:

Это мой оригинальный фрейм данных (я назвал его df16):

        Fecha inicio    Delito                  No delitos
0       2016-01-31      ABANDONO DE PERSONA     19
1       2016-01-31      ABORTO                  8
2       2016-01-31      ABUSO DE AUTORIDAD      112
3       2016-01-31      ABUSO DE CONFIANZA      241
.
.
.
2262    2016-12-31      VIOLACION               40
2263    2016-12-31      VIOLACION EQUIPARADA    4
2264    2016-12-31      VIOLACION TUMULTUARIA   1
2265    2016-12-31      VIOLENCIA FAMILIAR      1397

2266 rows × 1 columns

Задача 1)

У меня 276 категориальных переменных по месяцам,Моя цель - сгруппировать столбцы категориальных переменных по месяцам и показать столбец дат в формате, аналогичном (2016 / 01,2016 / 02, ... или январь / 2016, февраль / 2016, ...), и этоне показывать повторяющиеся даты для каждой категориальной переменной.Я пытаюсь сделать это следующим фрагментом кода:

df16.groupby(['Fecha inicio','Delito'])['No delitos'].sum().rename('No 
delitos').to_frame()

и выводом

                                            No delitos
Fecha inicio         Delito 
2016-01-31           ABANDONO DE PERSONA    19
                     ABORTO                 8
                     ABUSO DE AUTORIDAD     112
.
.
.
2016-12-31          VIOLACION EQUIPARADA    4
                    VIOLACION TUMULTUARIA   1
                    VIOLENCIA FAMILIAR      1397

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

Задача 2)

Я хотел бы построить график категориальных переменных за месяц, но, поскольку они представляют собой 276 переменных, это для меня нежизнеспособно, поэтому я хотел бы отфильтровать более высокие переменные или установить значение, скажем,'No delitos'> = 1000. Кроме того, я уже пытался сделать это, используя

df16.groupby('Fecha 
 inicio').nlargest(3).reset_index(level=0,drop=True).to_frame()

, и в результате это

                                                No delitos
Fecha inicio    Delito  
2016-01-31      VIOLENCIA FAMILIAR              1326
                ROBO DE OBJETOS                 1095
                DENUNCIA DE HECHOS              1064
.
.
.
2016-12-31     VIOLENCIA FAMILIAR               1397
                ROBO A NEGOCIO SIN VIOLENCIA    1209
                DENUNCIA DE HECHOS              1082

, но когда я пытаюсь построить график, используя

df16.pivot(index="Fecha inicio", columns="Delito", 
values="No delitos").plot()

plt.show()

Я получаю сообщение об ошибке: KeyError: 'Fecha inicio'.Итак, я хотел бы знать, как построить три столбца из кадра данных.Я надеюсь, что вы можете помочь мне, спасибо.

1 Ответ

0 голосов
/ 21 марта 2019

Вот предложение для обеих проблем.

enter image description here

import pandas as pd
import sys
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
print('System: {}'.format(sys.version))
for module in [pd, matplotlib,np]:
    print('Module {:10s} - version {}'.format(module.__name__, module.__version__))
df = pd.DataFrame({"Fecha inicio": ['2016-01-31', '2016-01-31', '2016-01-31', '2016-01-31', '2016-12-31', '2016-12-31',
                                    '2016-12-31', '2016-12-31', ],
                   "Delito": ["ABANDONO DE PERSONA", "ABORTO", "ABUSO DE AUTORIDAD", "ABUSO DE CONFIANZA", "VIOLACION",
                              "VIOLACION EQUIPARADA", "VIOLACION TUMULTUARIA", "VIOLENCIA FAMILIAR", ],
                   "No delitos": [19, 8, 112, 241, 40, 4, 1, 1397, ]
                   })
print(df)
df['date2'] = pd.to_datetime(df['Fecha inicio'], infer_datetime_format=True)
df['YearMonth'] = df['date2'].map(lambda x: '{}-{}'.format(x.year, x.month))
print('1---')
print(df)
print('2---')
print(df.groupby(['YearMonth', 'Delito'])['No delitos'].sum())
print('3---')
# pb 1
print(df.groupby(['YearMonth', 'Delito'])['No delitos'].sum().reset_index())

# pb 2
print('4---')
df = df.groupby(['YearMonth', 'Delito'])['No delitos'].sum()
print(df)

print('5---')
df = df.groupby('YearMonth').nlargest(3).reset_index(level=0,drop=True).reset_index()
print(df)

print('6--- Plotting df')
sns.barplot(data=df, x='YearMonth', y='No delitos', hue='Delito')

plt.show()

Выход:

System: 3.7.2 (default, Feb 21 2019, 17:35:59) [MSC v.1915 64 bit (AMD64)]
Module pandas     - version 0.24.1
Module matplotlib - version 3.0.2
Module numpy      - version 1.16.2
  Fecha inicio                 Delito  No delitos
0   2016-01-31    ABANDONO DE PERSONA          19
1   2016-01-31                 ABORTO           8
2   2016-01-31     ABUSO DE AUTORIDAD         112
3   2016-01-31     ABUSO DE CONFIANZA         241
4   2016-12-31              VIOLACION          40
5   2016-12-31   VIOLACION EQUIPARADA           4
6   2016-12-31  VIOLACION TUMULTUARIA           1
7   2016-12-31     VIOLENCIA FAMILIAR        1397
1---
  Fecha inicio                 Delito  No delitos      date2 YearMonth
0   2016-01-31    ABANDONO DE PERSONA          19 2016-01-31    2016-1
1   2016-01-31                 ABORTO           8 2016-01-31    2016-1
2   2016-01-31     ABUSO DE AUTORIDAD         112 2016-01-31    2016-1
3   2016-01-31     ABUSO DE CONFIANZA         241 2016-01-31    2016-1
4   2016-12-31              VIOLACION          40 2016-12-31   2016-12
5   2016-12-31   VIOLACION EQUIPARADA           4 2016-12-31   2016-12
6   2016-12-31  VIOLACION TUMULTUARIA           1 2016-12-31   2016-12
7   2016-12-31     VIOLENCIA FAMILIAR        1397 2016-12-31   2016-12
2---
YearMonth  Delito               
2016-1     ABANDONO DE PERSONA        19
           ABORTO                      8
           ABUSO DE AUTORIDAD        112
           ABUSO DE CONFIANZA        241
2016-12    VIOLACION                  40
           VIOLACION EQUIPARADA        4
           VIOLACION TUMULTUARIA       1
           VIOLENCIA FAMILIAR       1397
Name: No delitos, dtype: int64
3---
  YearMonth                 Delito  No delitos
0    2016-1    ABANDONO DE PERSONA          19
1    2016-1                 ABORTO           8
2    2016-1     ABUSO DE AUTORIDAD         112
3    2016-1     ABUSO DE CONFIANZA         241
4   2016-12              VIOLACION          40
5   2016-12   VIOLACION EQUIPARADA           4
6   2016-12  VIOLACION TUMULTUARIA           1
7   2016-12     VIOLENCIA FAMILIAR        1397
4---
YearMonth  Delito               
2016-1     ABANDONO DE PERSONA        19
           ABORTO                      8
           ABUSO DE AUTORIDAD        112
           ABUSO DE CONFIANZA        241
2016-12    VIOLACION                  40
           VIOLACION EQUIPARADA        4
           VIOLACION TUMULTUARIA       1
           VIOLENCIA FAMILIAR       1397
Name: No delitos, dtype: int64
5---
  YearMonth                Delito  No delitos
0    2016-1    ABUSO DE CONFIANZA         241
1    2016-1    ABUSO DE AUTORIDAD         112
2    2016-1   ABANDONO DE PERSONA          19
3   2016-12    VIOLENCIA FAMILIAR        1397
4   2016-12             VIOLACION          40
5   2016-12  VIOLACION EQUIPARADA           4
8--- Plotting df
...