我必须定义一个功能,从数据框中选择与销售相关的职位的任何人,并且必须包含以下功能:
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]
非常感谢你们。
答案 0 :(得分:1)
您可以使用由boolean indexing
和lower
创建的掩码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