【问题标题】:how to replace infinite value with maximum value of a pandas column?如何用熊猫列的最大值替换无限值?
【发布时间】:2018-11-19 06:00:54
【问题描述】:

我有一个看起来像

的数据框
City   Crime_Rate

A      10

B      20 

C      inf

D      15 

我想用 Crime_Rate 列的最大值替换 inf,这样我的结果数据框应该看起来像

City   Crime_Rate

A      10

B      20 

C      20

D      15

我试过了

df['Crime_Rate'].replace([np.inf],max(df['Crime_Rate']),inplace=True)

但是python将inf作为最大值,我哪里错了?

【问题讨论】:

    标签: python pandas replace infinite


    【解决方案1】:

    先过滤出inf的值,然后得到maxSeries

    m = df.loc[df['Crime_Rate'] != np.inf, 'Crime_Rate'].max()
    df['Crime_Rate'].replace(np.inf,m,inplace=True)
    

    另一种解决方案:

    mask = df['Crime_Rate'] != np.inf
    df.loc[~mask, 'Crime_Rate'] = df.loc[mask, 'Crime_Rate'].max()
    
    print (df)
      City  Crime_Rate
    0    A        10.0
    1    B        20.0
    2    C        20.0
    3    D        15.0
    

    【讨论】:

    • 这不是问题吗?
    • @Dark - 如果需要替换 np.inf
    【解决方案2】:

    use_inf_as_nan 设置为true,然后使用fillna。 (如果您想将 infnan 都视为缺失值,请使用此选项)即

    pd.options.mode.use_inf_as_na = True
    
    df['Crime_Rate'].fillna(df['Crime_Rate'].max(),inplace=True)
    
       City  Crime_Rate
    0    A        10.0
    1    B        20.0
    2    C        20.0
    3    D        15.0
    

    【讨论】:

    • 嗯,不知道是不是好主意,NaNinf 真的是不同的东西
    • @jezrael 只是另一种选择。有一天它可能对某人有帮助。如果我以通常的方式回答,它将与您的回答相同。所以
    • 然后添加通知 - 如果存在,它也会替换 NaN :)
    • @Dark,好的单线解决方案,谢谢。我一直在做的是编写另一行代码来替换 nan 为所需的值
    • 如果解决方案有帮助,请投票,如果您想用某个值替换 inf 并用某个其他值替换 nan,请不要使用此解决方案。祝你好运:)
    【解决方案3】:

    使用 max() 中的附加函数 replace(np.inf, np.nan) 的一种方法。

    对于 max() 内部发生的操作,它将 inf 替换为 nan,并且 max 返回预期的最大值而不是 inf

    以下示例:最大值为 100 并替换 inf

    #Create dummy data frame
    import pandas as pd 
    import numpy as np  
    a = float('Inf')
    v = [1,2,5,a,10,5,a,5,100,2]  
    df = pd.DataFrame({'Col_A': v})
    #Data frame looks like this
    In [33]: df
    Out[33]: 
            Col_A
    0    1.000000
    1    2.000000
    2    5.000000
    3         inf
    4   10.000000
    5    5.000000
    6         inf
    7    5.000000
    8  100.000000
    9    2.000000
    
    # Replace inf  
    df['Col_A'].replace([np.inf],max(df['Col_A'].replace(np.inf, 
    np.nan)),inplace=True)
    
    In[35]: df
    Out[35]: 
       Col_A
    0    1.0
    1    2.0
    2    5.0
    3  100.0
    4   10.0
    5    5.0
    6  100.0
    7    5.0
    8  100.0
    9    2.0
    

    希望有效!

    【讨论】:

      【解决方案4】:

      这是整个矩阵/数据框的解决方案:

      highest_non_inf = df.max().loc[lambda v: v<np.Inf].max() df.replace(np.Inf, highest_non_inf)

      【讨论】:

        【解决方案5】:

        使用numpy clip。它优雅且速度极快:

        import numpy as np
        import pandas as pd
        df = pd.DataFrame({"x": [-np.inf, +np.inf, np.nan, 4, 3]})
        df["x"] = np.clip(df["x"], -np.inf, 100)
        # Out:
        #       x
        # 0   -inf
        # 1  100.0
        # 2    NaN
        # 3    4.0
        # 4    3.0
        

        要同时消除负无穷大,请将-np.inf 替换为一个小数字。 NaN 始终不受影响。要获得最大值,请使用max(df["x"])

        【讨论】:

        • 不会max(df["x"]) 只返回inf
        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2023-02-01
        • 2022-12-23
        • 1970-01-01
        • 2018-11-04
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多