2014-10-28 1 views
9

У меня есть панды DataFrame, как показано ниже:GroupBy Панда DataFrame и вычислить среднее значение и STDEV из одного столбца и добавьте зЬй как новый столбец с reset_index

a  b  c  d 
0 Apple 3  5  7 
1 Banana 4  4  8 
2 Cherry 7  1  3 
3 Apple 3  4  7 

Я хотел бы сгруппировать строки по колонку «а 'при замене значений в столбце' c 'средним значением в сгруппированных строках и добавлением другого столбца с std-отклонением значений в столбце' c ', среднее значение которого было рассчитано. Значения в столбцах «b» или «d» постоянны для всех сгруппированных строк. Таким образом, желаемый выход будет:

a  b  c  d  e 
0 Apple 3  5  7  0.707107 
1 Banana 4  4  8  0 
2 Cherry 7  1  3  0 

Каков наилучший способ достичь этого?

ответ

13

Вы можете использовать groupby-agg operation:

In [38]: result = df.groupby(['a'], as_index=False).agg(
         {'c':['mean','std'],'b':'first', 'd':'first'}) 

, а затем переименовать и изменить порядок столбцов:

In [39]: result.columns = ['a','c','e','b','d'] 

In [40]: result.reindex(columns=sorted(result.columns)) 
Out[40]: 
     a b c d   e 
0 Apple 3 4.5 7 0.707107 
1 Banana 4 4.0 8  NaN 
2 Cherry 7 1.0 3  NaN 

Примечание среднее и станд отклонение сгруппированных c значений отличаются от того, что вы вывесили.


Pandas вычисляет образец std по умолчанию. Для того, чтобы вычислить зОе население:

def pop_std(x): 
    return x.std(ddof=0) 

result = df.groupby(['a'], as_index=False).agg({'c':['mean',pop_std],'b':'first', 'd':'first'}) 

result.columns = ['a','c','e','b','d'] 
result.reindex(columns=sorted(result.columns)) 

дает

 a b c d e 
0 Apple 3 4.5 7 0.5 
1 Banana 4 4.0 8 0.0 
2 Cherry 7 1.0 3 0.0 
+0

Спасибо @unutbu! – kkhatri99

+0

@unutbu: бы вы могли проверить этот вопрос http://stackoverflow.com/questions/26601001/calculate-std-manually-using-groupby-pandas-dataframe – user3378649

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