2017-10-12 75 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