为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫均值函数返回所有 NaN

熊猫均值函数返回所有 NaN

守着星空守着你 2022-09-20 16:49:34
我有这个数据帧:df = [{'A1':10, 'A2':''}, {'A1':11,'A2':110}, {'A1':12,'A2':120}]我想平均忽略''(空字符串)值的不同列。这是所需的输出df_AVG = [{'A1':10, 'A2':'','avg':10}, {'A1':11,'A2':110,'avg': 60.5}, {'A1':12,'A2':120,'avg':66}]我可以使用以下代码执行此操作:df['avg'] = df[['A1','A2']].mean(axis=1, numeric_only=True)但是当我修改数据帧并且它包含多个空格时,如下所示df = [{'A1':10, 'A2':''}, {'A1':'','A2':110}, {'A1':12,'A2':120}]我运行相同的代码,输出是这样的。所有“avg”值都是 NaN,包括以前有效的值:df_AVG = [{'A1':10, 'A2':'','avg':NaN}, {'A1':11,'A2':110,'avg': NaN}, {'A1':12,'A2':120,'avg':NaN}]你能告诉我这种方法有什么问题吗?谢谢!
查看完整描述

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

当您使用numeric_only它会“删除”非数字列,因此在第二种情况下,它会删除所有列,因为它们都是字符串。如果你更仔细地检查第一种情况的平均值,你会看到在第二行和第三行,它只采用11和12,因为110和120由于空字符串而被“丢弃”。


如果需要,您可以执行以下操作:



df['avg'] = df[['A1','A2']].replace('', np.nan).apply(lambda row: np.nanmean(row), axis=1)


它将“”替换为NaN,并得到忽略那些NaN的平均值


查看完整回答
反对 回复 2022-09-20
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

应将列强制为数值类型。一个简单的方法可以是:


df['avg'] = pd.DataFrame({col : pd.to_numeric(df[col]) for col in df.columns}).mean(axis=1)

它按预期提供:


   A1   A2    avg

0  10        10.0

1      110  110.0

2  12  120   66.0


查看完整回答
反对 回复 2022-09-20
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信