Pandas 系列布尔映射和绘图

Pandas Series boolean maps and plotting

我只是想加深我对绘制 Pandas 系列数据的理解,使用布尔值来掩盖我不想要的值。我不确定我所拥有的是正确或有效的方法。

不要误会我的意思,我确实得到了我想要的图表,但我对语法的假设是否正确?

我只想在图表上绘制非零值。我没有像往常一样格式化图表,因为这只是布尔值和屏蔽数据的测试,而不是用于创建报告等级图表。

如果我将其屏蔽为 Pandas DataFrame,如果 df1 是我的 DataFrame,我将执行以下操作。 我理解这一点并且 df1[mask] returns 我的值是必需的

是有道理的
# Plot our graph with only items that are non-zero
fig = px.bar(df1[mask], x = 'Animals', y = 'Count')
fig.show()

将其作为 Pandas 系列进行 这是创建我需要的图表的片段

# Plot our graph with only items that are non-zero
fig = px.bar(sf, x = sf.index[sf_mask], y = sf[sf_mask])
fig.show()

在我将我的掩码添加到 sf 并收到错误的初步测试之后。我推断我需要针对 x 和 y 参数添加掩码。我认为这是因为系列只是一个列,索引设置为我的“动物”。因此,通过映射 sf.index[sf_mask] 我在索引中得到了返回的动物,而 sf[sf_mask] returns 我得到了值。未能添加任何一个都会给出“ValueError”,指出参数应具有相同的长度。

这是我用来测试我的工作的方法

我最初的导入和设置 Plotly 作为我的绘图后端

import pandas as pd
import plotly.express as px

# Set our plotting backend to Plotly
pd.options.plotting.backend = "plotly"

我刚刚从字典创建了一个测试数据集

animals = {'rabbits' : 1,
       'dogs' : 3,
       'cats' : 0,
       'ferrets' : 3,
       'horses' : 8,
       'goldfish' : 0,
       'guinea_pigs' : 2,
       'hamsters' : 6,
       'mice' : 3,
       'rats' : 0
      }

然后将其转换为pandas系列

sf = pd.Series(animals)

然后我创建我的布尔掩码来屏蔽我们 Pandas 系列

中的所有非零条目
sf_mask = sf != 0

如果我随后查看掩码,我可以看到我只得到非零值,这正是我正在寻找的。

sf[sf_mask]

输出我系列中的非零项。

rabbits        1
dogs           3
ferrets        3
horses         8
guinea_pigs    2
hamsters       6
mice           3
dtype: int64

如果我在没有布尔掩码 'sf_mask' 的情况下使用以下语法进行绘图,我将得到完整的 Pandas 系列图

# Plot our Series showing all items
fig = px.bar(sf, x = sf.index, y = sf)
fig.show()

输出如下图表

如果我使用我的布尔掩码 'sf_mask' 使用以下语法绘制我得到我想要的图表,它排除了零值项的间隙。

# Plot our graph with only items that are non-zero
fig = px.bar(sf, x = sf.index[sf_mask], y = sf[sf_mask])
fig.show()

输出正确的图表。

您对布尔值和掩码的理解是正确的。

您可以稍微简化语法:如果您看一下 plotly.express.bar documentation,您会看到参数 'x''y'是可选的。您不需要传递 'x''y',因为默认情况下 plotly.express 将使用系列的索引作为 x 并将系列的值作为 y 创建柱。您也可以通过屏蔽系列代替整个系列。

例如,这将生成相同的条形图:

fig = px.bar(sf[sf>0])
fig.update_layout(showlegend=False)