【问题标题】:Count String Values in a Numeric Column Pandas计算数值列 Pandas 中的字符串值
【发布时间】:2023-04-10 04:39:01
【问题描述】:

我有一个数据框:

    Name    Hours_Worked
1   James   3
2   Sam     2.5
3   Billy   T
4   Sarah   A
5   Felix   5

第一个我如何计算我有非数字值的行数?

第二如何过滤以识别包含非数字值的行?

【问题讨论】:

    标签: python-3.x pandas data-cleaning


    【解决方案1】:

    使用to_numericerrors='coerce' 将非数字转换为NaNs 并通过isna 创建掩码:

    mask = pd.to_numeric(df['Hours_Worked'], errors='coerce').isna()
    #oldier pandas versions
    #mask = pd.to_numeric(df['Hours_Worked'], errors='coerce').isnull()    
    

    然后将Trues 的值按sum 计数:

    a = mask.sum()
    print (a)
    2
    

    并按boolean indexing过滤:

    df1 = df[mask]
    print (df1)
        Name Hours_Worked
    3  Billy            T
    4  Sarah            A
    

    详情

    print (mask)
    1    False
    2    False
    3     True
    4     True
    5    False
    Name: Hours_Worked, dtype: bool
    

    另一种检查数字的方法:

    def check_num(x):
        try:
            float(x)
            return False        
        except ValueError:
            return True
    
    mask = df['Hours_Worked'].apply(check_num)
    

    【讨论】:

    • 为什么df.Hours_Worked.str.isnumeric() 在这里不起作用?
    • @RafaelC - 因为浮动,它只适用于整数。
    • 认为isnumeric() 也可以与花车一起使用,很好:)
    • 太棒了,谢谢。这确实符合我的需要。我有点不想将我所有的字符串全部更改为 NaN,因为我想知道为什么字符串存在以确定我是否想要它用于其他东西。您的代码将帮助我比我目前知道的更好地识别这些行。
    【解决方案2】:

    在一天结束时,我这样做是为了在我的数字列中评估字符串:

    df['Hr_String'] = pd.to_numeric(df['Hours_Worked'], errors='coerce')
    

    我希望它在一个新列中,这样我就可以过滤并为我提供更多的流动性:

    df[df['Hr_String'].isnull()]
    

    返回:

        Name    Hours_Worked    Hr_String
    2   Billy   T               NaN
    3   Sarah   A               NaN
    

    然后我做了

    df['Hr_String'].isnull().sum()
    

    返回:

    2

    然后我想要总行数的百分比,所以我这样做了:

    teststr['Hr_String'].isnull().sum() / teststr.shape[0]
    

    返回:

    0.4

    总体而言,这种方法对我有用,它帮助我了解哪些字符串值与我的数字列混淆,并让我看到百分比,如果它真的很小,我可能会删除行进行分析。如果百分比很大,我必须弄清楚我是否可以估算它们或为它们找出其他东西。

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多