Python Pandas 2列关系

时间:2019-04-27 16:41:54

标签: python pandas data-science

第一场:武器

第二列:Pepetrator_Age

我要寻找的是哪种武器在哪个年龄段流行。 enter image description here

例如,我正在尝试绘制类似的图形,如下所示: enter image description here

例如y轴应为案例数 犯罪者的x轴年龄

线是凶手使用的武器类型

您可以将其复制粘贴到jupyter以初始化数据集

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
data = pd.read_csv("hdb.csv", low_memory=False)
cols = data.columns
cols = cols.map(lambda x: x.replace(' ', '_'))
data.columns = cols
#clear the unnecessary data here
data = data.drop(['Agency_Code', 'Victim_Ethnicity', 'Agency_Name','Agency_Type', 'Perpetrator_Ethnicity', 'Victim_Count', 'Perpetrator_Count'], axis=1)
data = data[data.Perpetrator_Age != "0"]
data = data[data.Perpetrator_Age != ""]
data = data[data.Perpetrator_Age != " "]
data = data[data.Victim_Sex != "Unknown"]
data = data[data.Victim_Race != "Unknown"]
data = data[data.Perpetrator_Sex != "Unknown"]
data = data[data.Perpetrator_Race != "Unknown"]
data = data[data.Relationship != "Unknown"]
data = data[data.Weapon != "Unknown"]
data

此处设置的数据: https://www.kaggle.com/jyzaguirre/us-homicide-reports

1 个答案:

答案 0 :(得分:1)

IIUC,这种数据分组最好以分组条形图的形式显示,例如在Seaborn的countplot中,而不是在折线图中,因为您想按特定的列着色(Weapon ),但您希望在x轴(Perpetrator_Age)上显示其他列。 AFAIK,折线图不会同时捕获这些聚集。

这是一个显式的熊猫groupby,用于显示您正在引用的聚合

df_grouped = df.groupby(['Perpetrator_Age', 'Weapon']).count()

print(df_grouped)
                               Perpetrator_Race  Relationship
Perpetrator_Age Weapon                                       
15              Blunt Object                  1             1
27              Knife                         1             1
36              Rifle                         1             1
42              Strangulation                 2             2

现在,您要在x轴上显示第一个索引级别(Perpetrator_Age),并且必须使用第二个索引级别Weapon为绘制的数据上色。

以下是一些方法(不需要groupby

Seaborn

  • 使用countplot会生成条形图(对应于案例数,或者通常是每个分组中的记录数),它使您可以指定用于分组数据的列< / li>
  • 由于您想通过Weapon列进行着色,因此countplot允许使用参数hue进行指定
  • 其他链接

进口

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(style="whitegrid")

代码

ax = sns.countplot(x="Perpetrator_Age", hue="Weapon", data=df)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles, labels=labels)
ax.set_ylabel("Number of cases")

Seaborn_approach

Altair

进口

import altair as alt
alt.renderers.enable('notebook')

代码

alt.Chart(df).mark_bar(size=15).encode(
    alt.Y('count(Weapon):Q', axis=alt.Axis(title='Number of cases')),
    alt.X('Perpetrator_Age:O', axis=alt.Axis(labelAngle=0)),
    color='Weapon:N'
).properties(
    width=250,
    height=250
)

Altair approach