PANDAS:按月,过滤器和图将分类变量分组

时间:2019-03-21 20:51:04

标签: pandas date dataframe filter group-by

我试图每月对一组分类变量进行分组,过滤它们的值并绘制这些变量和值,但是我对如何执行操作有一些疑问。我的问题如下:

这是我的原始数据框(我称其为df16):

.then

问题1)

我按月有276个分类变量。我的目标是按月份对列类别变量进行分组,并以类似于(2016 / 01,2016 / 02,...或Jan / 2016,Feb / 2016,...)的格式显示日期列,不显示每个分类变量的重复日期。我尝试通过下一段代码来做到这一点:

        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

和输出

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

但是我想尝试另一种替代方法。

问题2)

我想每月绘制分类变量,但是由于它们是276个变量,因此对我而言不可行,因此我想过滤更高的变量或建立一个值,例如'No delitos'> = 1000。好吧,已经尝试使用

                                            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

结果是

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

我收到一条错误消息:KeyError:'Fecha inicio'。因此,我想知道如何从数据框中绘制三列。我希望您能帮助我,谢谢。

1 个答案:

答案 0 :(得分:0)

这是两个问题的命题。

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