2017-10-12 78 views
0

我想计算某些时间序列或列的特征,如果需要的话。使用pd.DataFrame.agg创建特征向量

我知道我可以使用pandas.DataFrame.agg,但我似乎无法为DataFrame的结果列/行提供自定义名称。

下面的代码做什么,我想:

注:这只是一个例子。我知道我可以通过['sum', 'std', 'mean']等agg,但我想这样做任意聚合函数。

import pandas as pd 
import numpy as np 

n_series = 5 
n_time_samples = 10 

data = np.random.rand(n_time_samples, n_series) 
columns = ['s{:d}'.format(i) for i in range(n_series)] 

df = pd.DataFrame(data, columns=columns) 

df.agg([lambda x: x.mean(), 
     lambda x: x.std()], axis=0).T 

的结果为每个时间序列的特征向量:

<lambda> <lambda> 
s0 0.406411 0.330624 
s1 0.446666 0.301839 
s2 0.498958 0.159052 
s3 0.613881 0.353684 
s4 0.455623 0.287457 

不过,我想有一个合适的名字为特色。这是不可能通过一本字典,为了做到这一点:

# Throws KeyError 
df.agg({'f1': lambda x: x.mean(), 
     'f2': lambda x: x.std()}, axis=0).T 

我知道我可以通过设置df.columns重命名列,但我想知道如果我能解决这个问题只能用agg

补充说明:设置axis=1也将失败:

df.agg([lambda x: x.mean(), 
     lambda x: x.std()], axis=1).T 

这将引发

TypeError: ("'list' object is not callable", 'occurred at index 0') 

# Note transpose 
df.T.agg([lambda x: x.mean(), 
      lambda x: x.std()], axis=0).T 

是否行得通呢?

+0

@Zero是我知道的选项,但我希望能够做到这一点的任意函数。 – displayname

回答

0

以下是一种方法。

In [1023]: def f1(x): 
     ...:  return x.mean() 
     ...: 

In [1024]: def f2(x): 
     ...:  return x.std() 
     ...: 

In [1025]: df.agg([f1, f2], axis=0).T 
Out[1025]: 
      f1  f2 
s0 0.593445 0.282322 
s1 0.554996 0.247396 
s2 0.441740 0.321923 
s3 0.379589 0.295618 
s4 0.602647 0.259439 

要使用lambda funcs中,设置__name__

In [1042]: f1_ = lambda x: x.mean() 

In [1043]: f2_ = lambda x: x.std() 

In [1044]: f1_.__name__ = 'f1x' 

In [1045]: f2_.__name__ = 'f2x' 

In [1046]: df.agg([f1_, f2_], axis=0).T 
Out[1046]: 
     f1x  f2x 
s0 0.593445 0.282322 
s1 0.554996 0.247396 
s2 0.441740 0.321923 
s3 0.379589 0.295618 
s4 0.602647 0.259439 
+0

噢..反射ftw我猜...? :D – displayname

+0

我想那已经够好了 - 谢谢:) – displayname