从数据透视表绘制 Pandas DataFrame

Chu*_*woo 8 python pivot matplotlib pandas

我试图在 Jupyter Notebook 中使用 Pandas 绘制一个线图,比较 1960-1962 年特定州的谋杀率。

关于我现在所处位置以及我如何到达这里的一些背景信息:

我正在使用犯罪 csv 文件,如下所示: 在此输入图像描述

我暂时只对 3 列感兴趣:州、年份和谋杀率。具体来说,我只对 5 个州感兴趣:阿拉斯加州、密歇根州、明尼苏达州、缅因州、威斯康星州。

因此,为了生成所需的表格,我这样做了(仅显示前 5 行条目):

al_mi_mn_me_wi = crimes[(crimes['State'] == 'Alaska') | (crimes['State'] =='Michigan') | (crimes['State'] =='Minnesota') | (crimes['State'] =='Maine') | (crimes['State'] =='Wisconsin')]
control_df = al_mi_mn_me_wi[['State', 'Year', 'Murder Rate']]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

从这里我使用了pivot函数

df = control_1960_to_1962.pivot(index = 'Year', columns = 'State',values= 'Murder Rate' ) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这就是我陷入困境的地方。我在执行时收到 KeyError (KeyError 是 Year):

df.plot(x='Year', y='Murder Rate', kind='line')
Run Code Online (Sandbox Code Playgroud)

当尝试只是

df.plot()
Run Code Online (Sandbox Code Playgroud)

我得到了这张奇怪的图表。

在此输入图像描述

如何获得我想要的图表?

tel*_*tel 10

给定一个长(整洁)格式的数据帧,pandas.DataFrame.pivot用于转换为宽格式,可以直接使用pandas.DataFrame.plot

测试于python 3.8.11, pandas 1.3.3,matplotlib 3.4.3

import numpy as np
import pandas as pd

control_1960_to_1962 = pd.DataFrame({
    'State': np.repeat(['Alaska', 'Maine', 'Michigan', 'Minnesota', 'Wisconsin'], 3),
    'Year': [1960, 1961, 1962]*5,
    'Murder Rate': [10.2, 11.5, 4.5, 1.7, 1.6, 1.4, 4.5, 4.1, 3.4, 1.2, 1.0, .9, 1.3, 1.6, .9]
})

df = control_1960_to_1962.pivot(index='Year', columns='State', values='Murder Rate')

# display(df)
State  Alaska  Maine  Michigan  Minnesota  Wisconsin
Year                                                
1960     10.2    1.7       4.5        1.2        1.3
1961     11.5    1.6       4.1        1.0        1.6
1962      4.5    1.4       3.4        0.9        0.9
Run Code Online (Sandbox Code Playgroud)

地块

您可以明确告诉 Pandas(并通过它matplotlib实际进行绘图的包)您想要什么 xticks:

ax = df.plot(xticks=df.index, ylabel='Murder Rate')
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

ax是一个matplotlib.axes.Axes对象,你可以通过它对你的绘图进行很多很多的自定义。

States以下是如何在 x 轴上绘制:

ax = df.T.plot(kind='bar', ylabel='Murder Rate')
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述