我试图每月对一组分类变量进行分组,过滤它们的值并绘制这些变量和值,但是我对如何执行操作有一些疑问。我的问题如下:
这是我的原始数据框(我称其为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'。因此,我想知道如何从数据框中绘制三列。我希望您能帮助我,谢谢。
答案 0 :(得分:0)
这是两个问题的命题。
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