如何分组和绘制聚合数据?
How to groupby and plot aggregated data?
我的数据框中有一列包含用户登录日期,其格式如下:
0 2020-09-24 23:37:13+02:00
1 2020-09-24 22:08:02+02:00
2 2020-09-24 21:40:01+02:00
3 2020-09-24 21:16:22+02:00
4 2020-09-24 19:22:22+02:00
...
425 2020-09-07 12:55:56+02:00
426 2020-09-07 05:24:19+02:00
427 2020-09-07 05:23:17+02:00
428 2020-09-01 13:15:03+02:00
429 2020-09-01 13:10:24+02:00
Name: Login, Length: 430, dtype: datetime64[ns, Europe/Amsterdam]
我试图正确地形象化它,但我的每个解决方案都有问题。我的第一次尝试有不等长的 x-ticks(1 天与 6 天的长度相同)。
df['Login'] = df['Login'].dt.strftime('%d/%m/%y')
login_time = [login for login, df in df.groupby("Login")]
fig = plt.figure(figsize=(10, 5))
plt.plot(login_time, df.groupby(["Login"]).count())
plt.xticks(login_time, rotation = "40", ha='right', fontsize=14)
plt.ylabel("Number of logins", fontsize=20)
plt.xlabel("Date", fontsize=22)
plt.show()
将 df['Login'] = df['Login'].dt.strftime('%d/%m/%y')
更改为 df['Login'] = df['Login'].dt.date
returns 一个没有登录天数不给出 0 值的图。
我在想也许条形图可以很好地处理这些数据,但问题是将 plt.plot
更改为 plt.bar
会得到 ValueError: shape mismatch: objects cannot be broadcast to a single shape
,尽管我在想.count()
应 return 整数,创建二维投影。
我自己无法解决这个问题,我请求你帮助我并向 python 新手展示如何更好地解决这个问题。非常感谢!
- 始终将日期时间列配置为
datetime
类型,以便正确绘制。
- 将时间序列数据绘制为
str
类型,会导致错误的顺序、间距和其他意想不到的烦恼。
df['Login'] = df['Login'].dt.strftime('%d/%m/%y')
将 datetime
类型转换为 str
类型。
- 条形图,
datetime
数据作为 x-axis,具有整数索引刻度位置(例如 0、1、...、n)
- 一个线图,
datetime
数据作为 x-axis,有 datetime
个刻度位置。
- 没有必要做
[login for login, df in df.groupby("Login")]
和 plt.plot(login_time, df.groupby(["Login"]).count())
。
- 使用
.groupby
并聚合所需的指标 .count
,然后绘制 groupby
对象。
import pandas as pd
import matplotlib.pyplot as plt
# setup the dataframe
df = pd.DataFrame({'Login': ['2020-09-24 23:37:13+02:00', '2020-09-24 22:08:02+02:00', '2020-09-24 21:40:01+02:00', '2020-09-24 21:16:22+02:00', '2020-09-24 19:22:22+02:00 ', '2020-09-07 12:55:56+02:00', '2020-09-07 05:24:19+02:00', '2020-09-07 05:23:17+02:00', '2020-09-01 13:15:03+02:00', '2020-09-01 13:10:24+02:00']})
# convert to datetime type
df.Login = pd.to_datetime(df.Login, utc=True)
# groupby the date and count
dfg = df.groupby(df.Login.dt.date).count()
# plot the data as a barplot
ax = dfg.plot.bar(figsize=(8, 5), ylabel='Login Count', xlabel='Login Time')
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# plot a lineplot
ax = dfg.plot(marker='o', figsize=(8, 5), ylabel='Login Count', xlabel='Login Time')
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# plot a line plot on the bar plt
ax = dfg.plot.bar(figsize=(8, 5), ylabel='Login Count', xlabel='Login Time')
ax.plot(range(len(dfg.Login)), dfg.Login, color='k')
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
我的数据框中有一列包含用户登录日期,其格式如下:
0 2020-09-24 23:37:13+02:00
1 2020-09-24 22:08:02+02:00
2 2020-09-24 21:40:01+02:00
3 2020-09-24 21:16:22+02:00
4 2020-09-24 19:22:22+02:00
...
425 2020-09-07 12:55:56+02:00
426 2020-09-07 05:24:19+02:00
427 2020-09-07 05:23:17+02:00
428 2020-09-01 13:15:03+02:00
429 2020-09-01 13:10:24+02:00
Name: Login, Length: 430, dtype: datetime64[ns, Europe/Amsterdam]
我试图正确地形象化它,但我的每个解决方案都有问题。我的第一次尝试有不等长的 x-ticks(1 天与 6 天的长度相同)。
df['Login'] = df['Login'].dt.strftime('%d/%m/%y')
login_time = [login for login, df in df.groupby("Login")]
fig = plt.figure(figsize=(10, 5))
plt.plot(login_time, df.groupby(["Login"]).count())
plt.xticks(login_time, rotation = "40", ha='right', fontsize=14)
plt.ylabel("Number of logins", fontsize=20)
plt.xlabel("Date", fontsize=22)
plt.show()
将 df['Login'] = df['Login'].dt.strftime('%d/%m/%y')
更改为 df['Login'] = df['Login'].dt.date
returns 一个没有登录天数不给出 0 值的图。
我在想也许条形图可以很好地处理这些数据,但问题是将 plt.plot
更改为 plt.bar
会得到 ValueError: shape mismatch: objects cannot be broadcast to a single shape
,尽管我在想.count()
应 return 整数,创建二维投影。
我自己无法解决这个问题,我请求你帮助我并向 python 新手展示如何更好地解决这个问题。非常感谢!
- 始终将日期时间列配置为
datetime
类型,以便正确绘制。- 将时间序列数据绘制为
str
类型,会导致错误的顺序、间距和其他意想不到的烦恼。 df['Login'] = df['Login'].dt.strftime('%d/%m/%y')
将datetime
类型转换为str
类型。
- 将时间序列数据绘制为
- 条形图,
datetime
数据作为 x-axis,具有整数索引刻度位置(例如 0、1、...、n) - 一个线图,
datetime
数据作为 x-axis,有datetime
个刻度位置。 - 没有必要做
[login for login, df in df.groupby("Login")]
和plt.plot(login_time, df.groupby(["Login"]).count())
。- 使用
.groupby
并聚合所需的指标.count
,然后绘制groupby
对象。
- 使用
import pandas as pd
import matplotlib.pyplot as plt
# setup the dataframe
df = pd.DataFrame({'Login': ['2020-09-24 23:37:13+02:00', '2020-09-24 22:08:02+02:00', '2020-09-24 21:40:01+02:00', '2020-09-24 21:16:22+02:00', '2020-09-24 19:22:22+02:00 ', '2020-09-07 12:55:56+02:00', '2020-09-07 05:24:19+02:00', '2020-09-07 05:23:17+02:00', '2020-09-01 13:15:03+02:00', '2020-09-01 13:10:24+02:00']})
# convert to datetime type
df.Login = pd.to_datetime(df.Login, utc=True)
# groupby the date and count
dfg = df.groupby(df.Login.dt.date).count()
# plot the data as a barplot
ax = dfg.plot.bar(figsize=(8, 5), ylabel='Login Count', xlabel='Login Time')
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# plot a lineplot
ax = dfg.plot(marker='o', figsize=(8, 5), ylabel='Login Count', xlabel='Login Time')
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# plot a line plot on the bar plt
ax = dfg.plot.bar(figsize=(8, 5), ylabel='Login Count', xlabel='Login Time')
ax.plot(range(len(dfg.Login)), dfg.Login, color='k')
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')