2017-10-12 1 views
0

원하는 경우 시계열 또는 열의 일부 기능을 계산하고 싶습니다.pd.DataFrame.agg를 사용하여 특징 벡터 만들기

나는 그것에 대해 pandas.DataFrame.agg을 사용할 수 있지만 결과 롤스/DataFrame의 행에 사용자 정의 이름을 부여 할 수없는 것으로 보입니다.

참고 :

아래의 코드는 내가 원하는 것을이 그냥 예입니다. 나는 내가 ['sum', 'std', 'mean'] 등을 agg에 전달할 수 있다는 것을 알고 있지만, 에 대해 임의로 집계 함수를 수행하고 싶습니다.

<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 

그러나, 나는이 기능에 대한 적절한 이름을 가지고 싶습니다

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 

결과는 각 시계열에 대한 특징 벡터이다. 난 그냥 df.columns를 설정하여 열 이름을 바꿀 수 있습니다 알고

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

하지만이 단지 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을 설정 lambda funcs를 사용하지만 난 그 임의의 기능을 수행 할 수 있어야합니다. – 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 

는 네 해당 옵션의 인식 오전 __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

관련 문제