为了账号安全,请及时绑定邮箱和手机立即绑定

Python Pandas - 按类别分组,然后按类别绘制

Python Pandas - 按类别分组,然后按类别绘制

慕的地6264312 2022-10-25 15:09:27
非常简单的熊猫问题,我是初学者。我有一个数据框'df'(例如):import pandas as pddf = pd.DataFrame({'time': ['2019-04-23 10:21:00', '2019-04-23 11:14:00', '2019-04-24 11:30'],                    'category': ['A', 'B', 'A'],                   'text': ['njrnfrjn','fmrjfmrfmr','mjrnfjrnmi']})我只想:按类别和日期分组(每天)按类别和日期统计短信数量绘制跨天的所有时间序列(同一图中的每个类别一个时间序列)
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

您可以尝试以下方法:

df.groupby([df.time.dt.floor('d'), "category"]).size().unstack().plot()

说明

  • 第一步是像你提到的那样发牢骚。为此,我们使用groupby

  • 在 中groupby,因为我们需要times按天分组,所以一种解决方案是dt.floortime列上使用。我们传递 的论点"d"days

    • 此外,为确保floor可访问,该time列必须是time series. 如果不是,请使用pd.to_datetime将其转换为pd.to_datetime(df.time).

  • 现在我们有了组,可以使用该方法轻松计算大小size

  • 下一步是将category列(在此步骤中作为索引)转换为列。因为我们按两个键分组,所以我们可以使用unstack.

  • 最后,将其plot称为数据框。由于数据框结构良好,因此无需任何参数即可工作(每列绘制一条线,索引列 ( time) 用作x-axis


完整代码+插图

# import modules 

import pandas as pd

import matplotlib.pyplot as plt

# (here random is just for creating dummy data)

from random import randint, choice


# Create dummy data

size = 1000

df = pd.DataFrame({

    'time': pd.to_datetime(["2020/01/{} {}:{}".format(randint(1, 31), randint(0,23), randint(0,59)) for _ in range(size)]),

    'text': ['blablabla...' for _ in range(size)],

    'category': [choice(["A", "B", "C"]) for _ in range(size)]

})

print(df)

#                    time          text category

# 0   2020-01-30 23:15:00  blablabla...        C

# 1   2020-01-16 07:06:00  blablabla...        A

# 2   2020-01-03 18:47:00  blablabla...        A

# 3   2020-01-21 15:45:00  blablabla...        A

# 4   2020-01-10 04:11:00  blablabla...        C

# ..                  ...           ...      ...

# 995 2020-01-12 03:03:00  blablabla...        C

# 996 2020-01-08 10:35:00  blablabla...        B

# 997 2020-01-24 20:51:00  blablabla...        C

# 998 2020-01-05 07:39:00  blablabla...        A

# 999 2020-01-26 16:54:00  blablabla...        A


# See size result

print(df.groupby([df.time.dt.floor('d'), "category"]).size())

# time        category

# 2020-01-01  A            6

#             B           18

#             C            7

# 2020-01-02  A           10

#             B            8

#                         ..

# 2020-01-30  B           16

#             C           11

# 2020-01-31  A           14

#             B           17

#             C           11


# See unstack result

print(df.groupby([df.time.dt.floor('d'), "category"]).size().unstack())

# category     A   B   C

# time

# 2020-01-01   6  18   7

# 2020-01-02  10   8  13

# 2020-01-03  11  11  16

# 2020-01-04   9   5  10

# 2020-01-05  13   9  13

# 2020-01-06  11  11  12

# 2020-01-07  13   7   9

# 2020-01-08   5  16  13

# 2020-01-09  15   6  14

# 2020-01-10  10  11   9

# 2020-01-11   7  16  13

# 2020-01-12  12  13  13

# 2020-01-13  12   5   7

# 2020-01-14  11  10  11

# 2020-01-15  13  14  11

# 2020-01-16   9   8  13

# 2020-01-17   8   9   6

# 2020-01-18  12   5  11

# 2020-01-19   7   8  13

# 2020-01-20  12   9   9

# 2020-01-21   9  13  13

# 2020-01-22  14  11  19

# 2020-01-23  14   6  12

# 2020-01-24   7   8   6

# 2020-01-25  10  12  10

# 2020-01-26   8  12   7

# 2020-01-27  18  11   7

# 2020-01-28  15  10   9

# 2020-01-29  12   7  11

# 2020-01-30  12  16  11

# 2020-01-31  14  17  11


# Perform plot

df.groupby([df.time.dt.floor('d'), "category"]).size().unstack().plot()

plt.show()

输出:

//img1.sycdn.imooc.com//63578bd5000173ed19201029.jpg

查看完整回答
反对 回复 2022-10-25
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信