如何解决Pandas 基于多空列的行计算 Groupby 统计信息
df :
ST LW UD vl
E1 e1 pp@yr 2
F3 l1 pp@yr 4
F3 l2 pp@yr 7
E1 e3 pp2@yr 3
F3 l4 pp3@yr 13
E1 e5 pp3@yr 7
F3 l6 pp3@yr 9
E1 e7 pp2@yr 5
E1 e8 pp3@yr 3
F3 f9 pp4@yr 2
F3 f11 pp4@yr 5
F3 f13 pp5@yr 7
F3 f7 pp5@yr 9
我想要做的任务是根据列 ST 取均值和标准差,如果它只包含 E1 并执行以下操作:
dfD = df[df['ST'] == 'E1']
stats_df = dfD.groupby('UD')['vl'].describe()[['mean','std']]
mys = pd.DataFrame(stats_df).reset_index()
数据框 mys 如下所示:
mys
UD mean std
pp2@yr 4.0 1.414214
pp3@yr 5.0 2.828427
pp@yr 2.0 NaN
然后我将数据与原始数据框合并如下:
mdf = pd.merge(df,mys,how='left',on='UD')
结果数据框如下:
mdf
ST LW UD vl mean std
E1 e1 pp@yr 2 2.0 NaN
F3 l1 pp@yr 4 2.0 NaN
F3 l2 pp@yr 7 2.0 NaN
E1 e3 pp2@yr 3 4.0 1.414214
F3 l4 pp3@yr 13 5.0 2.828427
E1 e5 pp3@yr 7 5.0 2.828427
F3 l6 pp3@yr 9 5.0 2.828427
E1 e7 pp2@yr 5 4.0 1.414214
E1 e8 pp3@yr 3 5.0 2.828427
F3 f9 pp4@yr 2 NaN NaN
F3 f11 pp4@yr 5 NaN NaN
F3 f13 pp5@yr 7 NaN NaN
F3 f7 pp5@yr 9 NaN NaN
抱歉拖了这么久。但现在我来了实际的问题陈述:
问题是最后四行。问题是,无论何时均值和标准差都是空值,那么我想仅基于具有基于 ST = F3 的空值和基于 UD 列的 grouby 的行来计算均值和标准值。所以输出应该像(注意:我计算了最后 4 行的平均值和统计数据)
finaldf
ST LW UD vl mean std
E1 e1 pp@yr 2 2.0 NaN
F3 l1 pp@yr 4 2.0 NaN
F3 l2 pp@yr 7 2.0 NaN
E1 e3 pp2@yr 3 4.0 1.414214
F3 l4 pp3@yr 13 5.0 2.828427
E1 e5 pp3@yr 7 5.0 2.828427
F3 l6 pp3@yr 9 5.0 2.828427
E1 e7 pp2@yr 5 4.0 1.414214
E1 e8 pp3@yr 3 5.0 2.828427
F3 f9 pp4@yr 2 3.5 1.5
F3 f11 pp4@yr 5 3.5 1.5
F3 f13 pp5@yr 7 8.0 1.0
F3 f7 pp5@yr 9 8.0 1.0
我可以尝试遍历 'mdf' 数据框并查找 mean 和 std 列是否都具有空值,然后仅基于这些行进行分组,但在计算上效率不高,我正在寻找有效的 Pythonic 解决方案。任何帮助将不胜感激。
解决方法
好吧,如果您想要过滤掉数据框中具有空值的行,然后计算这些行的均值和标准差,您可以创建一个掩码并使用该掩码来过滤 df 并计算您的值希望稍后将它们插入到数据框中。
它看起来像这样:
mask = mdf[(mdf['mean'].isna()) & (mdf['std'].isna())]
mean = mask['v1'].mean()
std = mask['v1'].std()
mdf[(mdf['mean'].isna()) & (mdf['std'].isna())]['mean'] = mean
mdf[(mdf['mean'].isna()) & (mdf['std'].isna())]['std'] = std
注意:您可以继续向掩码添加限制,只需键入 &(and) |(or),后跟括号中的条件,例如: & (mdf['ST']='F3 ')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。