Python Pandas - 分组依据,然后按类别绘制
Python Pandas - Group by, then plot by category
很简单的pandas题,我是初学者
我有一个数据框 'df' 具有(例如):
import pandas as pd
df = 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']})
我只想:
- 按类别和日期分组(每天)
- 按类别和日期统计短信条数
- 绘制所有天数的时间序列(同一图中每个类别一个时间序列)
谢谢
您可以尝试以下方法:
df.groupby([df.time.dt.floor('d'), "category"]).size().unstack().plot()
解释:
- 第一步是 grouby,如您所述。为此,我们使用
groupby
在groupby
中,因为我们需要按天对times
进行分组,所以一种解决方案是在time
列上使用dt.floor
.我们为 days
.
传递参数 "d"
- 此外,要确保
floor
可访问,time
列必须是 time series
。如果不是,用pd.to_datetime
转换成pd.to_datetime(df.time)
.
现在我们有了组,大小可以很容易地应用size
方法计算出来。
下一步是将category
列(在这一步作为索引)转换为列。因为我们通过两个keygroupby,所以可以使用unstack
.
最后,将 plot
称为数据框。由于数据框结构良好,它可以在没有任何参数的情况下工作(每列绘制一条线,索引列(time
)用作x轴。
完整代码+插图:
# 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()
输出:
很简单的pandas题,我是初学者
我有一个数据框 'df' 具有(例如):
import pandas as pd
df = 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']})
我只想:
- 按类别和日期分组(每天)
- 按类别和日期统计短信条数
- 绘制所有天数的时间序列(同一图中每个类别一个时间序列)
谢谢
您可以尝试以下方法:
df.groupby([df.time.dt.floor('d'), "category"]).size().unstack().plot()
解释:
- 第一步是 grouby,如您所述。为此,我们使用
groupby
在
传递参数groupby
中,因为我们需要按天对times
进行分组,所以一种解决方案是在time
列上使用dt.floor
.我们为days
."d"
- 此外,要确保
floor
可访问,time
列必须是time series
。如果不是,用pd.to_datetime
转换成pd.to_datetime(df.time)
.
- 此外,要确保
现在我们有了组,大小可以很容易地应用
size
方法计算出来。下一步是将
category
列(在这一步作为索引)转换为列。因为我们通过两个keygroupby,所以可以使用unstack
.最后,将
plot
称为数据框。由于数据框结构良好,它可以在没有任何参数的情况下工作(每列绘制一条线,索引列(time
)用作x轴。
完整代码+插图:
# 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()
输出: