39

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

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

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

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

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


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

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

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

4

1 回答 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()

在此处输入图像描述

于 2013-03-17T20:52:57.310 回答