绘制Pandas GroupBy的结果

时间:2013-03-17 20:12:23

标签: python matplotlib group-by pandas data-analysis

我开始学习熊猫,并且正在尝试找到最多的Pythonic(或panda-thonic?)方法来完成某些任务。

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

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

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

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


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

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

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

1 个答案:

答案 0 :(得分: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()

enter image description here