亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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()

輸出:

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

查看完整回答
反對 回復 2022-10-25
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號