我现在的处境 Pandas Group Weighted Average of Multiple Columns但其中一列的某些值有时是NaN。你知道吗
也就是说,我正在做以下工作:
import pandas as pd
import numpy as np
df=pd.DataFrame({'category':['a','a','b','b'],
'var1':np.random.randint(0,100,4),
'var2':np.random.randint(0,100,4),
'weights':np.random.randint(0,10,4)})
df.loc[1,'var1']=np.nan
df
category var1 var2 weights
0 a 74.0 99 9
1 a NaN 8 4
2 b 13.0 86 2
3 b 49.0 38 7
def weighted(x, cols, w="weights"):
# Following fails when NaNs might be present:
#return pd.Series(np.average(x[cols], weights=x[w], axis=0), cols)
return pd.Series([np.nan if x.dropna(subset=[c]).empty else np.average(x.dropna(subset=[c])[c], weights =x.dropna(subset=[c])[w] ) for c in cols], cols)
df.groupby('category').apply(weighted, ['var1', 'var2'])
var1 var2
category
a 74.0 57.846154
b 23.0 8.000000
我想要个更好的方法,但是np.平均值不允许重量。np.平均值不允许选择控制NAN的治疗。你知道吗
没有比我的建议更清晰的答案了,我建议使用下面的函数并不是那么糟糕:
用法示例如下
把Nan值设为零,然后创建一个新列
var * weight
。然后可以使用groupby
获得结果。你知道吗在调用
apply
和unstack
之前,可以使用melt
和dropna
预处理数据帧注意:所需的输出与示例不匹配。
(a, 'var2')
的值是(99 * 9 + 8 * 4) / (9 + 4) = 71
相关问题 更多 >
编程相关推荐