2014-10-17 8 views
5

df.mean()을 사용할 때 각 열의 평균값이 주어지는 결과를 얻습니다. 이제 첫 번째 열의 평균과 두 번째 열의 합을 원한다고 가정 해 봅시다. 이것을 할 수있는 방법이 있습니까? 데이터 프레임을 분해하고 재구성해야 할 필요가 없습니다.팬더 : 다른 열에 다른 함수 적용

내 초기 아이디어는 그래서 같은 pandas.groupby.agg의 선()을 따라 뭔가 할 것이었다 :

df = pd.DataFrame(np.random.random((10,2)), columns=['A','B']) 
df.apply({'A':np.mean, 'B':np.sum}, axis=0) 

Traceback (most recent call last): 

    File "<ipython-input-81-265d3e797682>", line 1, in <module> 
    df.apply({'A':np.mean, 'B':np.sum}, axis=0) 

    File "C:\Users\Patrick\Anaconda\lib\site-packages\pandas\core\frame.py", line 3471, in apply 
    return self._apply_standard(f, axis, reduce=reduce) 

    File "C:\Users\Patrick\Anaconda\lib\site-packages\pandas\core\frame.py", line 3560, in _apply_standard 
    results[i] = func(v) 

TypeError: ("'dict' object is not callable", u'occurred at index A') 

을하지만 분명이 작동하지 않습니다. dict을 전달하는 것이 직관적 인 방법 일 것 같지만 또 다른 방법이 있습니다 (다시 DataFrame을 분해하고 다시 어셈블하지 않고)?

당신은 폐쇄를 시도 할 수 있습니다

답변

1

. 예 :

df = pd.DataFrame({'A': [0, 1, 2], 'B': [3, 4, 5]}) 

df = 
A B 
0 0 3 
1 1 4 
2 2 5 

df.agg({'A': 'mean', 'B': sum}) 

A  1.0 
B 12.0 
dtype: float64 
11

는 :

def multi_func(functions): 
    def f(col): 
     return functions[col.name](col) 
    return f 

df = pd.DataFrame(np.random.random((10, 2)), columns=['A', 'B']) 
result = df.apply(multi_func({'A': np.mean, 'B': np.sum})) 
+0

실제로는 꽤 좋습니다. 내 해결 방법은 하나의 열을 데이터 프레임에 삽입하고 해당 열에서 groupby를 수행 한 다음 집계 메서드에 dict를 전달하는 것이 었습니다. – pbreach

+0

감사합니다. 함수 dict에있는 키보다 DataFrame에 더 많은 열이있는 경우이 오류가 발생합니다. @ bill-letson도 그렇게 보았습니까? –

+0

전체 구현에는 ID 함수를 반환하는 try KeyError 절이 포함되어야합니다. lambda x : x –

1

그냥 자신이 상황을 직면 다음과 같은 내놓았다 : 난 당신이 인수로 사전으로 agg 방법을 사용할 수 있다고 생각

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([['one', 'two'], ['three', 'four'], ['five', 'six']], 
    ...:     columns=['A', 'B']) 

In [3]: df 
Out[3]: 
     A  B 
0 one two 
1 three four 
2 five six 

In [4]: converters = {'A': lambda x: x[:1], 'B': lambda x: x.replace('o', '')} 

In [5]: new = pd.DataFrame.from_dict({col: series.apply(converters[col]) 
    ...:        if col in converters else series 
    ...:        for col, series in df.iteritems()}) 

In [6]: new 
Out[6]: 
    A B 
0 o tw 
1 t fur 
2 f six 
관련 문제