在将未堆积的熊猫数据框传递给绘图函数之前,如何将其重塑为“长”形

时间:2020-06-15 00:40:02

标签: pandas plotly plotly-python

我正在尝试使用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']
                   })

我重置索引并创建数据透视表,如下所示:

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

我希望能够使用上面的数据绘制条形图,其中Manufacturer在x轴上,并用Sector进行着色,如下所示:

enter image description here

为此,我认为我需要数据采用以下长格式:

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或int或Series或类数组)– data_frame中的列名称,或pandas Series或array_like对象。此列或array_like中的值用于在笛卡尔坐标中沿x轴定位标记。 x或y可以是列引用或array_likes的列表,在这种情况下,数据将被视为“宽”而不是“长”。

谢谢!

2 个答案:

答案 0 :(得分:2)

只要不做function findOutlier(arr) { let isEven = true; const a = arr[0]; const b = arr[1]; if (([-1, 1].includes(a % 2) && [-1, 1].includes(b % 2))) { isEven = false; } else if (!(a % 2 === 0 && b % 2 === 0)) { const c = arr[2]; if (c % 2 === 1) isEven = false; } for (let i = 0; i < arr.length; i += 1) { const even = arr[i] % 2 === 0; if (even !== isEven) return arr[i]; } }

unstack

答案 1 :(得分:0)

这应该为您提供在那里的条形图。

test_df.groupby(['Manufacturer', 'Sector'])['Value'].sum().unstack('Sector').plot.bar()