【问题标题】:How to Loop over Numeric Column in Pandas Dataframe and filter Values?如何遍历 Pandas Dataframe 中的数字列并过滤值?
【发布时间】:2020-03-15 11:45:39
【问题描述】:

df:

Org_Name   Emp_Name   Age  Salary
0  Axempl    Rick       29    1000
1  Lastik    John       34    2000
2  Xenon     sidd       47    9000
3  Foxtrix   Ammy      thirty 2000
4  Hensaui   giny       33    ten  
5  menuia    rony      fifty  7000
6  lopex     nick       23    Ninety

我想遍历数字列(年龄,工资)来检查每个值是否为数字,如果数字列中存在的字符串值过滤掉记录并创建一个没有该错误的新数据框。

输出:

  Org_Name   Emp_Name   Age  Salary
0  Axempl    Rick       29    1000
1  Lastik    John       34    2000
2  Xenon     sidd       47    9000

【问题讨论】:

    标签: python python-3.x pandas python-2.7 for-loop


    【解决方案1】:

    您可以使用掩码来指示AgeSalary 列中是否存在字符串类型:

    mask_str = (df[['Age', 'Salary']]
                .applymap(lambda x: str(type(x)))
                .sum(axis=1)
                .str.contains("str"))
    df[~mask_str]
    

    这是假设数据框已经包含正确的类型。如果没有,您可以使用以下方法进行转换:

    def convert(val):
        try:
            return int(val)
        except ValueError:
            return val
    
    df = (df.assign(Age=lambda f: f.Age.apply(convert), 
                    Salary=lambda f: f.Salary.apply(convert)))
    

    【讨论】:

      【解决方案2】:

      您可以扩展此 answer 以过滤数字数据类型的多个列:

      import pandas as pd
      from io import StringIO
      
      data = """
      Org_Name,Emp_Name,Age,Salary
      Axempl,Rick,29,1000
      Lastik,John,34,2000
      Xenon,sidd,47,9000
      Foxtrix,Ammy,thirty,2000
      Hensaui,giny,33,ten  
      menuia,rony,fifty,7000
      lopex,nick,23,Ninety
      """
      
      df = pd.read_csv(StringIO(data))
      print('Original dataframe\n', df)
      
      df = df[(df.Age.apply(lambda x: x.isnumeric())) &
              (df.Salary.apply(lambda x: x.isnumeric()))]
      print('Filtered dataframe\n', df)
      

      给予

      Original dataframe
         Org_Name Emp_Name     Age  Salary
      0   Axempl     Rick      29    1000
      1   Lastik     John      34    2000
      2    Xenon     sidd      47    9000
      3  Foxtrix     Ammy  thirty    2000
      4  Hensaui     giny      33   ten  
      5   menuia     rony   fifty    7000
      6    lopex     nick      23  Ninety
      Filtered dataframe
         Org_Name Emp_Name Age Salary
      0   Axempl     Rick  29   1000
      1   Lastik     John  34   2000
      2    Xenon     sidd  47   9000
      

      【讨论】:

        【解决方案3】:

        我相信这可以使用 Pandas 的“to_numeric”函数来解决。

        import pandas as pd
        
        df['Column to Check'] = pd.to_numeric(df['Column to Check'], downcast='integer', errors='coerce')
        
        df.dropna(axis=0, inplace=True)
        

        其中“要检查的列”是您正在检查的列名,其中的值不能转换为整数(或任何数字类型);在您的问题中,我相信您会希望将此代码应用于“年龄”和“薪水”。如果无法将这些列中的任何值转换为您选择的类型,“to_numeric”会将它们转换为 NaN。 “dropna”方法将删除所有列中包含 NaN 的所有行。

        要按照您的要求遍历列,您可以执行以下操作:

        for col in ['Age', 'Salary']:
                df[col] = pd.to_numeric(df[col], downcast='integer', errors='coerce')
        df.dropna(axis=0, inplace=True)
        

        编辑: 回应哈利的评论。如果数据中存在预先存在的 NaN,则类似以下内容应保留在其他列之一中具有预先存在的 NaN 的任何有效行。

        for col in ['Age', 'Salary']:
            df[col] = pd.to_numeric(df[col], downcast='integer', errors='coerce')
            df = df[df[col].notnull()]
        

        【讨论】:

        • dropna 也会删除实际的空值。
        • 这很好。如果数据中已经存在 NaN,还有其他方法可以从 DataFrame 中删除适当的行。
        猜你喜欢
        • 2014-05-11
        • 2020-01-01
        • 2021-04-24
        • 2014-10-17
        • 2022-10-25
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多