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
我想做的是:
当A B C为数字时,平均值=(A + B + C)/ 3
当其中一个ABC是np.nan时,平均值= sum / 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
个对象。