2014-10-17 3 views
5

При использовании df.mean() Я получаю результат, в котором задается среднее значение для каждого столбца. Теперь предположим, что я хочу среднее значение первого столбца и сумму второго. Есть ли способ сделать это? Я не хочу разбирать и собирать данные.Pandas: применять различные функции к разным столбцам

Моя первоначальная идея состояла в том, чтобы сделать что-то вдоль линий 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

Я думаю, что вы можете использовать метод agg со словарем в качестве аргумента , Например:

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

Это на самом деле довольно приятно. Мое обходное решение заключалось в том, чтобы вставить столбец единиц в блок данных, выполнив группу по этому столбцу, а затем передав dict в агрегированный метод. – pbreach

+0

Спасибо! Я замечаю, что это не удается, если в DataFrame больше столбцов, чем ключей в функции dict. @ bill-letson вы тоже это видели? –

+0

Полная реализация должна включать предложение KeyError, которое возвращает функцию идентификации: lambda x: x –

1

Просто столкнулся с этой ситуацией сам и придумал следующее:

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 
Смежные вопросы