【问题标题】:Pandas mean function returns all NaNPandas 均值函数返回所有 NaN
【发布时间】:2020-03-30 13:57:44
【问题描述】:

我有这个数据框:

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}]

您能告诉我这种方法有什么问题吗?谢谢!

【问题讨论】:

    标签: python pandas dataframe average nan


    【解决方案1】:

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

    如果你愿意,你可以这样做:

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

    它用 NaN 替换 '' 并得到忽略那些 NaN 的平均值

    【讨论】:

    • 我明白了,谢谢!你会用什么方法跳过空格并用 Pandas 平均两列?
    • 刚刚编辑了帖子,看看是不是你想要的
    【解决方案2】:

    您应该将列强制转换为数字类型。一个简单的方法可能是:

    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
    

    【讨论】:

    • 非常感谢!这也是一种有用的方法,也有效,但我会给布鲁诺梅洛解决的答案,因为他先回答了
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2019-10-12
    • 2022-01-20
    相关资源
    最近更新 更多