如何重新分组或调整数据以构建堆叠柱状图?

-1 投票
1 回答
36 浏览
提问于 2025-04-12 22:51

我有一个数据表,所有的数据都在一行里,有很多列用来存放不同的数值。我需要把这些数据重新整理一下,以便制作一个堆叠的条形图(最好是用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()

在这里输入图片描述

撰写回答