如何在Pandas Dataframe中循环数字列并筛选值?

2024-09-27 02:14:53 发布

您现在位置:Python中文网/ 问答频道 /正文

测向:

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

Tags: nameorgagejohn数值rickxenonsalary
3条回答

您可以扩展此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

我相信这个问题可以用熊猫的“tou 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)

其中,'Column to Check'是您正在检查的列名,其中的值不能转换为整数(或任何数字类型);在您的问题中,我相信您会希望将此代码应用于'Age'和'Salary'如果这些列中的任何值不能转换为您选择的类型,则“to\u 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()]

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

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

这是假设dataframe已经包含正确的类型。如果没有,可以使用以下方法转换它们:

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)))

相关问题 更多 >

    热门问题