【问题标题】:Either operating on a numeric value or replacing cell with nan对数值进行操作或用 nan 替换单元格
【发布时间】:2017-03-04 00:41:58
【问题描述】:

pandas.DataFrame df 中,假设我有一个列E

如果E 包含整数或浮点数,我想将其替换为10^6 * E

但是,如果 E 包含非数字字符或只是空格,我想用 np.nan 替换它。

有没有使用applyapplymap 和lambda 函数的简单方法?

作为健全性检查,对数字行执行此操作:

df['E'] = df['E'] *  1000000 

这在语法上是正确的,但没有改变任何东西:

df['E'].apply(lambda x: x*1000000 if isinstance(x, (int, float)) else np.nan) 

也许我必须做一些选角,不确定。

【问题讨论】:

    标签: python pandas dataframe lambda


    【解决方案1】:

    您可以传递一个函数来代替 lambda。像这样的东西似乎有效。

    代码:

    def times_million(a_number):
        try:
            return float(a_number) * 1000000
        except:
            return np.nan
    

    测试代码:

    import pandas as pd
    import numpy as np 
    
    data = [x.strip().split() for x in """
        E
        1.0
        1
        xyzzy
    """.split('\n')[1:-1]]
    df = pd.DataFrame(data=data[1:], columns=data[0])
    
    print(df['E'].apply(times_million))
    

    结果:

    0    1000000.0
    1    1000000.0
    2          NaN
    Name: E, dtype: float64
    

    【讨论】:

    • 差不多了...我为您的 times_million 函数制作了一个小模块,以添加明确的 ValueError 检查,因为我在某些行中有一些奇怪的值。我从打印语句中看到我现在确实得到了正确的列(调整后的数字与 NaN 混合)但原始 df 没有改变 - 有什么方法可以将它保存在同一个语句中?
    • 缩小例外的范围可能是可取的,但为什么必要的
    • 你是对的,我没有正确阅读输出。没有必要添加 ValueError。我这样做df['E'] = df['E'].apply(times_million) 将其保存到df。也许这一切对 lambda 的要求有点过分。
    • 是的,所有的例子都使用了 lambda,所以我们倾向于认为 lambda 并试图在其中塞进太多东西。定义一个函数真的没有缺点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2011-05-23
    • 2019-09-29
    • 2020-06-05
    相关资源
    最近更新 更多