如何使用np.average计算包含np.nan的平均值? (使用groupby时)

时间:2017-02-18 06:50:48

标签: python pandas numpy

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

DataFrame:

  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. 当A B C为数字时,平均值=(A + B + C)/ 3

  2. 当其中一个ABC是np.nan时,平均值= sum / 2

2 个答案:

答案 0 :(得分: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 {/ 3>}

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
$xmlResponseString = file_get_contents($apiUrl)
$xmlResponse = simplexml_load_string($xmlResponseString);

答案 1 :(得分: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个对象。