2017-02-18 7 views
1
import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.arange(10).reshape(-1, 2), columns=['A', 'B']) 
df['C']=[5,2,np.nan,4,np.nan] 
df['index']=df.index 

The DataFrame:Как caculate в среднем в то время как с помощью np.nan с указанной np.average (При использовании GroupBy)

A B C index 
0 0 1 5  0 
1 2 3 2  1 
2 4 5 NaN 2 
3 6 7 4  3 
4 8 9 NaN 4 

Я хочу использовать GroupBy Funciton, чтобы вычислить среднее значение "A" «B» «C» для каждого индекса.

df1 = df.groupby('index') 
average = df1.apply(lambda df,x,y :np.average(df.iloc[:,x:y]),0,3) 

В среднем:

index 
0  2.00 
1  2.33 
2  NaN 
3  5.67 
4  NaN 
dtype:float64 

, что я хочу сделать в том, что:

  1. , когда АВС являются цифрами, среднее = (А + В + С)/3

  2. , когда один из ABC является np.nan, средний = сумма/2

+0

Я не знаю панд, но разве вы не можете использовать 'np.nanmean'? –

+0

@Paul Panzer OMG.np.nanmean решает проблему. –

+0

@jezrael, что вы имеете в виду уникальный индекс? «индекс», который я использовал здесь, просто для функции groupby –

ответ

1

Вы можете использовать пользовательскую функцию:

Вы можете использовать GroupBy.mean - NaN являются опущен:

#groupby by index 
df1 = df.groupby(level=0) 
#groupby by column index 
#df1 = df.groupby('index') 

#filter columns for apply first, item() is for return scalar 
average = df1['A','B','C'].apply(lambda x: x.mean(axis=1).item()) 
print (average) 
0 2.000000 
1 2.333333 
2 4.500000 
3 5.666667 
4 8.500000 
dtype: float64 

Или с идеей от Paul Panzer comment:

df1 = df.groupby(level=0) 
average = df1['A','B','C'].apply(np.nanmean) 
print (average) 
0 2.000000 
1 2.333333 
2 4.500000 
3 5.666667 
4 8.500000 
dtype: float64 

Также groupby не является необходимым, выберите только нужные столбцы и используйте DataFrame.mean с axis=1:

df['new'] = df[['A','B','C']].mean(axis=1) 
print (df) 
    A B C index  new 
0 0 1 5.0  0 2.000000 
1 2 3 2.0  1 2.333333 
2 4 5 NaN  2 4.500000 
3 6 7 4.0  3 5.666667 
4 8 9 NaN  4 8.500000 

print (df) 
    A B C 
0 0 1 5.0 
1 2 3 2.0 
2 4 5 NaN 
3 6 7 4.0 
4 8 9 NaN 

#if need mean of all columns 
df['new'] = df.mean(axis=1) 
print (df) 
    A B C  new 
0 0 1 5.0 2.000000 
1 2 3 2.0 2.333333 
2 4 5 NaN 4.500000 
3 6 7 4.0 5.666667 
4 8 9 NaN 8.500000 
0

Почему NumPy вместо pandas.mean()?

df 
Out[207]: 
    A B C 
0 0 1 5.0 
1 2 3 2.0 
2 4 5 NaN 
3 6 7 4.0 
4 8 9 NaN 

In [210]: df.mean(axis=1) 
Out[210]: 
0 2.000000 
1 2.333333 
2 4.500000 
3 5.666667 
4 8.500000 
dtype: float64 

Это то, что вам нужно, а также работает на объектах groupby.

+0

Я хочу, чтобы в среднем для каждой строки не были столбцы –

+0

Установите ось в 1, тогда она будет делать строки. –

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

  • Нет связанных вопросов^_^