【问题标题】:Resampling Pandas DataFrame by hour and plotting a stacked bar chart using Plotly按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图
【发布时间】:2021-09-12 21:54:59
【问题描述】:

我有一个如下的熊猫数据框

MAC Address ts Parameter1 Parameter2
af3d116c 2021-05-05 21:58:45 20 50
bffe479a 2021-05-05 21:58:48 22 52
c3a8fe37 2021-05-05 21:58:52 21 53
af3d116c 2021-05-05 21:58:58 27 50
bffe479a 2021-05-05 21:59:16 23 51
c3a8fe37 2021-05-05 21:59:50 28 52
af3d116c 2021-05-05 22:08:32 30 49
af3d116c 2021-05-05 22:16:30 27 55
bffe479a 2021-05-05 22:31:37 20 53
c3a8fe37 2021-05-05 22:52:49 32 52
af3d116c 2021-05-05 23:22:02 41 58
bffe479a 2021-05-05 23:44:31 37 62
bffe479a 2021-05-05 23:45:12 29 58
bffe479a 2021-05-05 23:49:28 34 41
c3a8fe37 2021-05-05 23:52:47 47 56

我想重新采样数据框,最后绘制堆叠条形图(最好使用 plotly),表示每小时记录的总行数,并根据 MA​​C 地址进行颜色编码。

下面是我希望它如何可视化的表示。 (抱歉,它没有使用上面列出的数据,但表明我希望它是怎样的。每个条形代表一个小时,例如:22:00 到 23:00,用代表 MAC 地址的颜色分隔。)

【问题讨论】:

  • 你能解释一下'resample'是什么意思吗?你的意思是分组吗?
  • 我不介意重采样是如何完成的。它可以使用 groupby 或 pandas 中的 resample 方法或其他方法。我的目标是得到如前所述的堆积条形图。

标签: python pandas dataframe plotly bar-chart


【解决方案1】:

您可以使用 pd.Grouper(key='ts', freq='1h') 进行 groupby 以按小时“重新采样”数据帧。 size 将为您提供 MAC 地址的频率计数:

import pandas as pd
import plotly.express as px

data = {'MAC Address': {1: 'af3d116c', 2: 'bffe479a', 3: 'c3a8fe37', 4: 'af3d116c', 5: 'bffe479a', 6: 'c3a8fe37', 7: 'af3d116c', 8: 'af3d116c', 9: 'bffe479a', 10: 'c3a8fe37', 11: 'af3d116c', 12: 'bffe479a', 13: 'bffe479a', 14: 'bffe479a', 15: 'c3a8fe37'}, 'ts': {1: '2021-05-05 21:58:45', 2: '2021-05-05 21:58:48', 3: '2021-05-05 21:58:52', 4: '2021-05-05 21:58:58', 5: '2021-05-05 21:59:16', 6: '2021-05-05 21:59:50', 7: '2021-05-05 22:08:32', 8: '2021-05-05 22:16:30', 9: '2021-05-05 22:31:37', 10: '2021-05-05 22:52:49', 11: '2021-05-05 23:22:02', 12: '2021-05-05 23:44:31', 13: '2021-05-05 23:45:12', 14: '2021-05-05 23:49:28', 15: '2021-05-05 23:52:47'}, 'Parameter1': {1: 20, 2: 22, 3: 21, 4: 27, 5: 23, 6: 28, 7: 30, 8: 27, 9: 20, 10: 32, 11: 41, 12: 37, 13: 29, 14: 34, 15: 47}, 'Parameter2': {1: 50, 2: 52, 3: 53, 4: 50, 5: 51, 6: 52, 7: 49, 8: 55, 9: 53, 10: 52, 11: 58, 12: 62, 13: 58, 14: 41, 15: 56}}
df = pd.DataFrame(data)
df['ts'] = pd.to_datetime(df['ts'])

plot_df = df.groupby([pd.Grouper(key='ts', freq='1h'), 'MAC Address']).size().reset_index().rename(columns={0: "count"})

这将导致:

ts MAC Address count
0 2021-05-05 21:00:00 af3d116c 2
1 2021-05-05 21:00:00 bffe479a 2
2 2021-05-05 21:00:00 c3a8fe37 2
3 2021-05-05 22:00:00 af3d116c 2
4 2021-05-05 22:00:00 bffe479a 1
5 2021-05-05 22:00:00 c3a8fe37 1
6 2021-05-05 23:00:00 af3d116c 1
7 2021-05-05 23:00:00 bffe479a 3
8 2021-05-05 23:00:00 c3a8fe37 1

然后,您可以根据需要进行绘制。例如:

fig = px.bar(plot_df, x="ts", y="count", color="MAC Address", title="MAC Addresses per hour")
fig.show()

【讨论】:

  • 完美。非常感谢。我习惯于 groupby 操作,但对 pd.Grouper 很陌生。感谢您向我介绍这个概念。
猜你喜欢
  • 2016-05-24
  • 2018-11-26
  • 2020-02-08
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多