2017-02-18 43 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 

數據框:而方含np.nan使用np.average如何caculate平均(當使用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功能可按計算「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. 當ABC是數字,平均=(A + B + C)/ 3

  2. 當ABC之一是np.nan,平均值= sum/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是沒有必要的,只選擇所需的列並使用和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,那麼它會做行。 –