2016-08-12 2 views
0

У меня есть DataFrame, на котором я бегу:Как создать новые столбцы с помощью pandas groupby & aggregate?

df.groupby(by="mycol").agg({"colA": "sum", "colB": "count"}) 

Однако colA и colB должны существовать. Каков самый «пандайский» подход к созданию новых столбцов из агрегации?

Edit:

В принципе, у меня есть набор колонок, и мои агрегирование не являются 1: отображение 1. Таким образом, рассмотрим пример, в котором я хотел бы агрегировать отношение значений двух столбцов в качестве нового столбца. Теперь подумайте о словаре таких отображений.

Я знаю, что в этом примере я мог бы просто фильтровать для play, а затем вычислить среднее значение для сгруппированных данных. Но это не вопрос, поэтому, пожалуйста, проигнорируйте это простое решение, которое является просто побочным эффектом простого примера.

>> df 
    outlook play temperature 
0  sunny True   25 
1  sunny True   25 
2 overcast True   19 
3  rain False   21 
4 overcast False   33 
5  rain False   27 
6  rain False   22 
7 overcast True   26 
8  sunny True   13 
9  sunny True   16 

# should become: 
>> df.groupby(by="outlook").agg(?) 
     play_mean_temp 
sunny 19.75 
overcast 22.50 
rain  NaN 
+0

ли вам нужен 'df.groupby (по =" Mycol ") .agg (['sum', 'count'])'? – jezrael

+0

Можете ли вы добавить образец данных и желаемый результат? – jezrael

+0

@jezrael добавлен по вашему желанию. Спасибо за помощь! – Xiphias

ответ

1

В вашей выборке вы можете использовать:

print (df.groupby(by="outlook").apply(lambda x: x.ix[x.play, 'temperature'].mean())) 
outlook 
overcast 22.50 
rain   NaN 
sunny  19.75 

Если использование первого булевой индексацию, некоторые строки опускают:

print (df[df.play].groupby(by="outlook")['temperature'].mean()) 
outlook 
overcast 22.50 
sunny  19.75 
Name: temperature, dtype: float64 
+0

Это замечательно. Еще одна вещь: если у меня есть две совокупности, как я могу получить их в один DataFrame? Вы получили мне серию здесь, но предположим, что у меня есть две из этих совокупностей из одних и тех же исходных данных. Что бы я сделал? – Xiphias

+1

Затем вы можете использовать пользовательскую функцию и вернуть новый 'DataFrame', см. [Docs] (http://pandas.pydata.org/pandas-docs/stable/groupby.html#flexible-apply). – jezrael

+1

Я думаю 'In [117]' in 'docs.' – jezrael

Смежные вопросы