绘制Pandas GroupBy的结果

39 投票
1 回答
38483 浏览
提问于 2025-04-17 19:25

我刚开始学习Pandas,想找一些最符合Python风格(或者说Pandas风格?)的方法来完成一些任务。

假设我们有一个数据表(DataFrame),里面有三列:A、B和C。

  • 列A包含布尔值:每一行的A值要么是true,要么是false。
  • 列B有一些我们想要绘制的重要数值。

我们想要了解的是,A为false的行和A为true的行在B值上的细微差别。

换句话说,我该如何根据列A的值(true或false)进行分组,然后在同一张图上绘制这两个组的列B的值呢? 这两个数据集应该用不同的颜色来区分,以便能看出不同的点。


接下来,我们想给这个程序增加一个新功能:在绘图之前,我们想为每一行计算一个新值,并把它存储在列D中。这个值是记录前五分钟内,所有列B的数据的平均值,但只包括那些在列A中有相同布尔值的行。

换句话说,如果我有一行数据,其中 A=Truetime=t,我想计算列D的值,这个值是从时间 t-5t 之间,所有 A=True 的记录在列B的平均值。

在这种情况下,我们该如何对A的值进行分组,然后对每个组应用这个计算,最后绘制这两个组的D值呢?

1 个回答

43

我觉得@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()

在这里输入图片描述

撰写回答