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)
我只是想加深我对绘制 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)