【问题标题】:Python Pandas 2 Column RelationPython Pandas 2 列关系
【发布时间】:2019-09-16 20:35:42
【问题描述】:

第一栏:武器

第二列:Pepetrator_Age

我想要找到的是哪个武器在哪个时代流行。

例如,我正在尝试绘制类似这样的图表:

例如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

【问题讨论】:

  • 请发布代码以生成您的数据。这将比发布图像更好,并且更有可能有人会发布回复。 :)
  • 你可以在这里下载它ufile.io/br1nhwl4
  • 我相信您正在寻找countplot 而不是线图。

标签: python pandas data-science


【解决方案1】:

IIUC,这种数据分组可能更好地显示为分组条形图,例如在 Seaborn 的 countplot 中,而不是在折线图中,因为您想按特定列着色 (Weapon) 但您想要在 x 轴上显示不同的列 (Perpetrator_Age)。 AFAIK,线图不会同时捕获这些聚合。

这是一个明确的 pandas 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,它将生成一个计数条形图(对应于案例数,或者通常是每个分组中的记录数),它允许您指定用于对数据进行分组的列
  • 由于您想按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")

牵牛星

进口

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
)

【讨论】:

  • 您好!感谢您的精彩回答。我还有一个问题。如何以正确的方式显示肇事者年龄与事件总数之间的关系?我的意思是,如果我画一张图表,很明显它会随着年龄的增长而下降,但是在数据科学中这样做的正确方法是什么,谢谢
  • @lastpeony4,如果您想显示事件总数随Perpetrator_Age 的变化(而不用Weapon 分隔),那么您可以groupby 超过Perpetrator_Age,计算案例数,然后只需使用简单的折线图即可显示结果:ax = df.groupby(['Perpetrator_Age'])['Weapon'].count().plot(kind='line'); ax.set_ylabel("Number of cases");
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 2019-01-14
  • 1970-01-01
  • 2023-02-09
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多