【问题标题】:Normal Distribution Plot by name from pandas dataframe来自 pandas 数据框的名称正态分布图
【发布时间】:2017-06-05 17:40:16
【问题描述】:

我有一个如下的数据框:

dateTime        Name    DateTime        day seconds zscore
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 15:17 james   11/1/2016 15:17 Tue 55020   1.158266091
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 13:41 james   11/1/2016 13:41 Tue 49260   -0.836236954
11/1/2016 13:42 james   11/1/2016 13:42 Tue 49320   -0.81546088
11/1/2016 13:42 james   11/1/2016 13:42 Tue 49320   -0.81546088
11/1/2016 13:42 james   11/1/2016 13:42 Tue 49320   -0.81546088
11/1/2016 13:42 james   11/1/2016 13:42 Tue 49320   -0.81546088
11/1/2016 13:42 james   11/1/2016 13:42 Tue 49320   -0.81546088
11/1/2016 13:42 james   11/1/2016 13:42 Tue 49320   -0.81546088
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:07  matt    11/1/2016 9:07  Tue 32820   -0.223746683
11/1/2016 9:08  matt    11/1/2016 9:08  Tue 32880   -0.111873342
11/1/2016 9:48  matt    11/1/2016 9:48  Tue 35280   4.363060322

zscore计算如下:

grp2 = df.groupby(['Name'])['seconds']
df['zscore'] = grp2.transform(lambda x: (x - x.mean()) / x.std(ddof=1))

我想将我的数据绘制在钟形曲线/正态分布图中,并将其保存为我的数据框中每个名称的图片/pdf 文件。

我试图绘制如下的 zscores:

df['by_name'].plot(kind='hist', normed=True)
range = np.arange(-7, 7, 0.001)
plt.plot(range, norm.pdf(range,0,1))
plt.show()

如何为数据中的每个名称绘制 by_name zscores 列?

【问题讨论】:

  • 当你说你“试图像下面那样绘制 zscores”时,结果是什么,结果与你期望的相差多远,你到底期望什么?
  • 结果显示 zscore 列作为一个整体未按用户名分组的绘图。本质上,我想用上面的数据查看 4 个不同的图。

标签: python pandas matplotlib plot seaborn


【解决方案1】:
np.random.seed([3,1415])
df = pd.DataFrame(dict(
        Name='matt joe adam farley'.split() * 100,
        Seconds=np.random.randint(4000, 5000, 400)
    ))

df['Zscore'] = df.groupby('Name').Seconds.apply(lambda x: x.div(x.mean()))

df.groupby('Name').Zscore.plot.kde()


分割图

g = df.groupby('Name').Zscore
n = g.ngroups
fig, axes = plt.subplots(n // 2, 2, figsize=(6, 6), sharex=True, sharey=True)
for i, (name, group) in enumerate(g):
    r, c = i // 2, i % 2
    group.plot.kde(title=name, ax=axes[r, c])
fig.tight_layout()


kde + hist

g = df.groupby('Name').Zscore
n = g.ngroups
fig, axes = plt.subplots(n // 2, 2, figsize=(6, 6), sharex=True, sharey=True)
for i, (name, group) in enumerate(g):
    r, c = i // 2, i % 2
    a1 = axes[r, c]
    a2 = a1.twinx()
    group.plot.hist(ax=a2, alpha=.3)
    group.plot.kde(title=name, ax=a1, c='r')
fig.tight_layout()

【讨论】:

  • 当可能有数千个名字时,您将如何表示?
  • 你必须选择。你要求单独的地块。你想要成千上万的地块吗?或者您想按每个n 名称进行分组?
  • @johnnyb 你能提供一个实际的数据集吗?
猜你喜欢
  • 2019-11-09
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2019-04-15
  • 2011-12-27
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多