如何重新分组或调整数据以构建堆叠柱状图?
我有一个数据表,所有的数据都在一行里,有很多列用来存放不同的数值。我需要把这些数据重新整理一下,以便制作一个堆叠的条形图(最好是用plotly来做)。下面是数据的样本:
Car 1 Fastest Time | Car 1 Slowest Time | Car 1 End Time | Car 2 Fastest Time | Car 2 Slowest Time | Car 2 End Time | Car 3 Fastest Time | Car 3 Slowest Time | Car 3 End Time
我想把数据整理成3列,分别是每辆车的最快时间、最慢时间和结束时间,这些数据都要放在每辆车的同一列里。
我尝试过重新分组数据和拆分数据,但都没有成功。我对pandas还很陌生。
1 个回答
0
一个只有一行的DataFrame(数据框)不太好用,所以我们需要稍微调整一下:为了简单起见,我会把你的DataFrame变成长格式,也就是说每个数据点占一行(因为你有三辆车,每辆车有三次观察,所以总共有9行数据)。
import pandas as pd
import plotly.express as px
df = pd.DataFrame({
'Car 1 Fastest Time': [55.0],
'Car 1 Slowest Time': [90.0],
'Car 1 End Time': [60.0],
'Car 2 Fastest Time': [60.0],
'Car 2 Slowest Time': [80.0],
'Car 2 End Time': [70.0],
'Car 3 Fastest Time': [70.0],
'Car 3 Slowest Time': [90.0],
'Car 3 End Time': [80.0]
})
df_long = df.T.reset_index().rename(columns={'index': 'category', 0: 'Time'})
df_long['TimeCategory'] = df_long['category'].str.split(' ',expand=True)[2]
df_long['Car'] = df_long['category'].str.split(' ',expand=True)[[0,1]].agg(' '.join, axis=1)
df_long
看起来是这样的:
category Time TimeCategory Car
0 Car 1 Fastest Time 55.0 Fastest Car 1
1 Car 1 Slowest Time 90.0 Slowest Car 1
2 Car 1 End Time 60.0 End Car 1
3 Car 2 Fastest Time 60.0 Fastest Car 2
4 Car 2 Slowest Time 80.0 Slowest Car 2
5 Car 2 End Time 70.0 End Car 2
6 Car 3 Fastest Time 70.0 Fastest Car 3
7 Car 3 Slowest Time 90.0 Slowest Car 3
8 Car 3 End Time 80.0 End Car 3
现在我们可以使用 px.bar
,把长格式的DataFrame和每个时间类别(最快、最慢、结束)所需的值和颜色传进去。Plotly 还有一些有用的文档可以参考 [这里]。(https://plotly.com/python/bar-charts/#bar-charts-with-long-format-data)
fig = px.bar(df_long, x='Car', y='Time', color='TimeCategory')
fig.show()