如何定义使用其他函数过滤数据框的函数

时间:2017-09-28 13:15:57

标签: pandas dataframe filtering

我必须定义一个功能,从数据框中选择与销售相关的职位的任何人,并且必须包含以下功能:

def isSales(job):
    a = job.lower()
    if 'sales' in a:
        return 'True'

基本上它是对数据框的过滤,但该功能将通过另一个功能,并将包含具有“销售”的职位名称的功能。

这是一个可以使用的假数据帧。

employee = {'EmployeeID' : [0,1,2,3,4,5,6,7,8,9],
         'FirstName' : ['a','b','c','d','e','f','g','h','i','j'],
         'LastName' : ['a','b','c','d','e','f','g','h','i','j'],
         'MiddleName' : ['a','b','c','d','e','f','g','h','i',None]
         'JobTitle : ['Production Supervisor', 'Technician', 'Buyer', 'Sales Manager', 'Data Scientist', 'President', 'Vice President of Sales', 'Manager', 'Stocker', 'Sales Accountant'}

employee_df = pd.DataFrame(employee)

在我定义之后,我必须检查此代码并查看它是否正常工作

sales_df = filterSales(employees_df)
print "Number of rows: %d\nNumber of cols: %d\n" % (sales_df.shape[0], sales_df.shape[1])
print "Head of index: %s\n" % (sales_df.index[:10])
print "Record of sales employee with ID=280\n"
print sales_df.loc[280]

非常感谢你们。

1 个答案:

答案 0 :(得分:1)

您可以使用由boolean indexinglower创建的掩码contains

print (employee_df[employee_df['JobTitle'].str.lower().str.contains('sales')])
   EmployeeID FirstName                 JobTitle LastName MiddleName
3           3         d            Sales Manager        d          d
6           6         g  Vice President of Sales        g          g
9           9         j         Sales Accountant        j       None

也可以创建函数,其中job是列名

def isSales(job):
    return employee_df[employee_df[job].str.lower().str.contains('sales')]

print (isSales('JobTitle'))
   EmployeeID FirstName                 JobTitle LastName MiddleName
3           3         d            Sales Manager        d          d
6           6         g  Vice President of Sales        g          g
9           9         j         Sales Accountant        j       None

如果输入为DataFrame并且需要所有列,并且所有行都包含sales

def isSales(df):
    bool_df = df.astype(str).apply(lambda x: x.str.lower().str.contains('sales'))
    return df.loc[bool_df.any(axis=1), bool_df.any()]
    #for return all columns
    #return df[bool_df.any(axis=1)]

print (isSales(employee_df))
                  JobTitle
3            Sales Manager
6  Vice President of Sales
9         Sales Accountant

如果需要使用您的功能并创建另一个用于过滤,请使用applymap来处理DataFrame中的每个元素以返回boolean DataFrame。对于任何列中包含sales的所有行,最后使用any

但是,如果数据中有一些isSales,则您的函数NaN会失败。

def isSales(job):
    a = str(job).lower()
    if 'sales' in a:
        return True

def filterSales(df):
    bool_df = df.applymap(isSales)
    return df[bool_df.any(axis=1)]

sales_df = filterSales(employee_df)
print (sales_df)
   EmployeeID FirstName                 JobTitle LastName MiddleName
3           3         d            Sales Manager        d          d
6           6         g  Vice President of Sales        g          g
9           9         j         Sales Accountant        j       None