Pandas GroupBy 的绘图结果

Posted

技术标签:

【中文标题】Pandas GroupBy 的绘图结果【英文标题】:Plotting results of Pandas GroupBy 【发布时间】:2013-03-06 03:06:37 【问题描述】:

我开始学习 Pandas,并试图找到最 Pythonic(或 Panda-thonic?)的方法来完成某些任务。

假设我们有一个包含 A、B 和 C 列的 DataFrame。

A 列包含布尔值:每一行的 A 值要么为真,要么为假。 B 列有一些我们想要绘制的重要值。

我们想要发现的是 A 设置为 false 的行的 B 值与 A 设置为 true 的行的 B 值之间的细微差别。

换句话说,如何按 A 列的值(真或假)进行分组,然后在同一张图上绘制两组的 B 列值?这两个数据集应该用不同的颜色来区分这些点。


接下来,让我们为这个程序添加另一个功能:在绘图之前,我们要为每一行计算另一个值并将其存储在 D 列中。这个值是在 A 之前的整个五分钟内存储在 B 中的所有数据的平均值记录 - 但我们只包含存储在 A 中的具有相同布尔值的行。

换句话说,如果我有一行 A=Truetime=t,我想计算列 D 的值,它是从时间 t-5 到 @987654324 的所有记录的 B 的平均值@ 具有相同的A=True

在这种情况下,我们如何对 A 的值执行 groupby,然后将此计算应用于每个单独的组,最后绘制两个组的 D 值?

【问题讨论】:

你有一些示例数据框吗?看起来你可以做一些事情,比如将 groupby 对象保存在一个变量中:grouped = df.groupby('A'),然后做一个 for 循环来绘制:for g, d in grouped: plot(d['B'], color=g)。第二个问题或多或少相同,您可以在其中使用 pandas rolling_mean 创建新列 D。 【参考方案1】:

我认为@herrfz 达到了所有的高点。我只是充实细节:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

sin = np.sin
cos = np.cos
pi = np.pi
N = 100

x = np.linspace(0, pi, N)
a = sin(x)
b = cos(x)

df = pd.DataFrame(
    'A': [True]*N + [False]*N,
    'B': np.hstack((a,b))
    )

for key, grp in df.groupby(['A']):
    plt.plot(grp['B'], label=key)
    grp['D'] = pd.rolling_mean(grp['B'], window=5)    
    plt.plot(grp['D'], label='rolling (k)'.format(k=key))
plt.legend(loc='best')    
plt.show()

【讨论】:

这太完美了!您能否谈谈如何为 D 列实现更多自定义计算,如果说我想做一些内置“滚动”Pandas 函数未涵盖的专门计算?谢谢。 (@herrfz) rolling_mean 只是many rolling functions in Pandas 之一。要定义自定义滚动函数,请使用rolling_apply。链接页面上有一个示例。 谢谢。我无法将该示例适应我想要完成的任务,所以我在这里问了另一个问题:***.com/questions/15487022/…

以上是关于Pandas GroupBy 的绘图结果的主要内容,如果未能解决你的问题,请参考以下文章

在 pandas groupby 绘图栏中重新排序星期几

应用 pandas groupby 后,在绘图中添加条形以显示平均值

使用 groupby 的结果过滤 pandas 数据框

没有聚合单个结果的 Pandas Groupby

将 GroupBy 平均结果添加为 pandas 中的新列

Pandas将groupby操作的结果保存为原始数据框中的新列[关闭]