绘制Pandas GroupBy的结果
我刚开始学习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=True
且 time=t
,我想计算列D的值,这个值是从时间 t-5
到 t
之间,所有 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()