如何在将未堆叠的 Pandas 数据框传递给绘图函数之前将其重塑为 "long" 形式
How to reshape an unstacked Pandas data frame to "long" form before passing it to a plotting function
我正在尝试使用 Plotly px.bar()
函数制作一个简单的条形图来显示比率。
我有以下数据集:
test_df = pd.DataFrame({'Manufacturer':['Ford', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW'],
'Metric':['Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Sales', 'Sales', 'Sales', 'Sales', 'Sales', 'Sales', 'Warranty', 'Warranty', 'Warranty', 'Warranty', 'Warranty', 'Warranty'],
'Sector':['Germany', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA'],
'Value':[45000, 70000, 90000, 65000, 40000, 65000, 63000, 2700, 4400, 3400, 3000, 4700, 5700, 1500, 2000, 2500, 1300, 2000, 2450],
'City': ['Frankfurt', 'Bremen', 'Berlin', 'Hamburg', 'New York', 'Chicago', 'Los Angeles', 'Dresden', 'Munich', 'Cologne', 'Miami', 'Atlanta', 'Phoenix', 'Nuremberg', 'Dusseldorf', 'Leipzig', 'Houston', 'San Diego', 'San Francisco']
})
我重置索引并创建一个枢轴table,如下::
temp_table = test_df.reset_index().pivot_table(values = 'Value', index = ['Manufacturer', 'Metric', 'Sector'], aggfunc='sum')
然后,我创建了两个新的数据框:
s1 = temp_table.set_index(['Manufacturer','Sector']).query("Metric=='Orders'").Value
s2 = temp_table.set_index(['Manufacturer','Sector']).query("Metric=='Sales'").Value
然后,我拆开这些数据帧:
s1.div(s2).unstack()
这给了我:
Sector Germany USA
Manufacturer
---
BMW 19.117647 11.052632
Ford 42.592593 13.333333
Mercedes 20.454545 13.829787
我希望能够使用上面的数据制作条形图,x 轴为 Manufacturer
,颜色为 Sector
,如下所示:
为此,我想我需要数据采用以下长格式:
Manufacturer Sector Ratio
BMW Germany 19.117647
Ford Germany 42.592593
Mercedes Germany 20.454545
BMW USA 11.052632
Ford USA 13.333333
Mercedes USA 13.829787
问题:我将如何重塑上面未堆叠的数据,以便能够将其传递给 Plotly px.bar() 函数,这需要以下 x 轴和 y 轴参数:
x (str or int or Series or array-like) – data_frame 中列的名称或 pandas 系列或 array_like目的。此列或 array_like 中的值用于在笛卡尔坐标系中沿 x 轴定位标记。 x 或 y 可以是列引用列表或 array_likes,在这种情况下,数据将被视为“宽”而不是“长”。
提前致谢!
就是不做unstack
df_out=s1.div(s2).reset_index()
这应该会为您提供上面的条形图。
test_df.groupby(['Manufacturer', 'Sector'])['Value'].sum().unstack('Sector').plot.bar()
我正在尝试使用 Plotly px.bar()
函数制作一个简单的条形图来显示比率。
我有以下数据集:
test_df = pd.DataFrame({'Manufacturer':['Ford', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW'],
'Metric':['Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Sales', 'Sales', 'Sales', 'Sales', 'Sales', 'Sales', 'Warranty', 'Warranty', 'Warranty', 'Warranty', 'Warranty', 'Warranty'],
'Sector':['Germany', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA'],
'Value':[45000, 70000, 90000, 65000, 40000, 65000, 63000, 2700, 4400, 3400, 3000, 4700, 5700, 1500, 2000, 2500, 1300, 2000, 2450],
'City': ['Frankfurt', 'Bremen', 'Berlin', 'Hamburg', 'New York', 'Chicago', 'Los Angeles', 'Dresden', 'Munich', 'Cologne', 'Miami', 'Atlanta', 'Phoenix', 'Nuremberg', 'Dusseldorf', 'Leipzig', 'Houston', 'San Diego', 'San Francisco']
})
我重置索引并创建一个枢轴table,如下::
temp_table = test_df.reset_index().pivot_table(values = 'Value', index = ['Manufacturer', 'Metric', 'Sector'], aggfunc='sum')
然后,我创建了两个新的数据框:
s1 = temp_table.set_index(['Manufacturer','Sector']).query("Metric=='Orders'").Value
s2 = temp_table.set_index(['Manufacturer','Sector']).query("Metric=='Sales'").Value
然后,我拆开这些数据帧:
s1.div(s2).unstack()
这给了我:
Sector Germany USA
Manufacturer
---
BMW 19.117647 11.052632
Ford 42.592593 13.333333
Mercedes 20.454545 13.829787
我希望能够使用上面的数据制作条形图,x 轴为 Manufacturer
,颜色为 Sector
,如下所示:
为此,我想我需要数据采用以下长格式:
Manufacturer Sector Ratio
BMW Germany 19.117647
Ford Germany 42.592593
Mercedes Germany 20.454545
BMW USA 11.052632
Ford USA 13.333333
Mercedes USA 13.829787
问题:我将如何重塑上面未堆叠的数据,以便能够将其传递给 Plotly px.bar() 函数,这需要以下 x 轴和 y 轴参数:
x (str or int or Series or array-like) – data_frame 中列的名称或 pandas 系列或 array_like目的。此列或 array_like 中的值用于在笛卡尔坐标系中沿 x 轴定位标记。 x 或 y 可以是列引用列表或 array_likes,在这种情况下,数据将被视为“宽”而不是“长”。
提前致谢!
就是不做unstack
df_out=s1.div(s2).reset_index()
这应该会为您提供上面的条形图。
test_df.groupby(['Manufacturer', 'Sector'])['Value'].sum().unstack('Sector').plot.bar()