2013-03-17 67 views
37

我开始学习熊猫,并试图找到最棘手的(或熊猫吞噬?)方式来完成某些任务。熊猫集团的绘图结果

假设我们有一个列的数据帧A,B和C

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

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

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


接下来,让我们添加另一个特点是此程序:图形之前,我们要计算每行的另一个值并将其存储在列D.此值存储在B中整个所有数据的平均值创纪录的前五分钟 - 但我们只包括具有存储在A.

换句话说,如果我有一排相同的布尔值行,其中A=Truetime=t,我要计算列d的值是从时间t-5t的所有记录的B的均值,其具有相同的A=True

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

+4

你有一些例子dataframes?看起来像你可以做一些事情,比如将groupby对象保存在一个变量中:'grouped = df.groupby('A')',然后做一个for-loop来绘制:'g,d in groupped:plot(d [ 'B'],color = g)'。第二个问题或多或少都是一样的,你可以使用熊猫'rolling_mean'来创建新的列D. – herrfz 2013-03-17 20:26:19

回答

42

我认为@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

+0

这很完美!如果说我想做一些没有被内置的“滚动”Pandas函数覆盖的专门计算,您能否谈谈如何为D列实现更多的自定义计算?谢谢。 (@herrfz) – 2013-03-18 07:06:57

+0

'rolling_mean'只是[Pandas中的许多滚动函数]之一(http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments)。要定义自定义滚动功能,请使用'rolling_apply'。链接页面上有一个示例。 – unutbu 2013-03-18 10:42:14

+0

谢谢。我在修改该示例时遇到了麻烦,因此我在此问了另一个问题:http://stackoverflow.com/questions/15487022/customizing-rolling-apply-function-in-python-pandas – 2013-03-18 21:17:01