我开始学习熊猫,并且正在尝试找到最多的Pythonic(或panda-thonic?)方法来完成某些任务。
假设我们有一个包含A,B和C列的DataFrame。
我们想要发现的是A值设置为false的行的B值与A值为真的行的B值之间的细微差别。
换句话说,如何按列A的值(真或假)进行分组,然后在同一图表上绘制两个组的B列值?这两个数据集应该有不同的颜色,以区分点。
接下来,让我们为这个程序添加另一个功能:在绘图之前,我们想为每一行计算另一个值并将其存储在D列中。这个值是B之前整个五分钟内存储在B中的所有数据的平均值。记录 - 但我们只包含存储在A中的具有相同布尔值的行。
换句话说,如果我有A=True
和time=t
的行,我想计算D列的值,它是时间{{的所有记录的B的平均值1}}到t-5
具有相同的t
。
在这种情况下,我们如何在A的值上执行groupby,然后将此计算应用于每个单独的组,最后绘制两个组的D值?
答案 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()