用多个条件过滤Pandas数据框架
在这篇文章中,让我们来讨论如何用多个条件过滤Pandas数据框。在整个软件开发过程中,有可能从Pandas数据框中用多个条件过滤数据。原因是数据框架可能有多列和多行。选择性地显示列和有限的行,总是用户所期望的观点。为了满足用户的期望,也为了帮助机器深度学习的场景,对Pandas数据框架进行多条件过滤是非常必要的。
让我们看看有哪些不同的方法。
创建一个样本数据框架以进一步开展工作
# import module
import pandas as pd
# assign data
dataFrame = pd.DataFrame({'Name': [' RACHEL ', ' MONICA ', ' PHOEBE ',
' ROSS ', 'CHANDLER', ' JOEY '],
'Age': [30, 35, 37, 33, 34, 30],
'Salary': [100000, 93000, 88000, 120000, 94000, 95000],
'JOB': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY',
'IT', 'ARTIST']})
# display dataframe
display(dataFrame)
输出:
方法1:使用定位
在这里,我们将从数据框中获得所有工资大于或等于100000,年龄小于40,工作以’D’开头的行。打印带有姓名和工作的详细信息。对于上述要求,我们可以通过使用loc来实现。它被用来通过标签或布尔数组访问单个或多个行和列。
# import module
import pandas as pd
# assign data
dataFrame = pd.DataFrame({'Name': [' RACHEL ', ' MONICA ', ' PHOEBE ',
' ROSS ', 'CHANDLER', ' JOEY '],
'Age': [30, 35, 37, 33, 34, 30],
'Salary': [100000, 93000, 88000, 120000, 94000, 95000],
'JOB': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY',
'IT', 'ARTIST']})
# filter dataframe
display(dataFrame.loc[(dataFrame['Salary']>=100000) & (dataFrame['Age']< 40) & (dataFrame['JOB'].str.startswith('D')),
['Name','JOB']])
输出:
输出解决了给定的条件,最后,我们将只显示2列,即姓名和工作。
方法2:使用NumPy。
这里将从数据框中获取所有工资大于或等于100000,年龄小于40,工作以’D’开头的行。我们需要使用NumPy。
# import module
import pandas as pd
import numpy as np
# assign data
dataFrame = pd.DataFrame({'Name': [' RACHEL ', ' MONICA ', ' PHOEBE ',
' ROSS ', 'CHANDLER', ' JOEY '],
'Age': [30, 35, 37, 33, 34, 30],
'Salary': [100000, 93000, 88000, 120000, 94000, 95000],
'JOB': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY',
'IT', 'ARTIST']})
# filter dataframe
filtered_values = np.where((dataFrame['Salary']>=100000) & (dataFrame['Age']< 40) & (dataFrame['JOB'].str.startswith('D')))
print(filtered_values)
display(dataFrame.loc[filtered_values])
输出:
在上面的例子中,print(filtered_values)将给出(array([0], dtype=int64),)的输出,这表明索引值为0的第一行将被输出。之后,输出将有1行所有的列,并根据给定的条件进行检索。
方法3:使用查询(评价和查询只对列起作用)
在这种方法中,我们从数据框架中获得所有工资小于或等于100000,年龄小于40,并且工作以’C’开头的记录。它只是用一个或多个布尔表达式来查询数据框架的列,如果是多个,它在中间有&条件。
# import module
import pandas as pd
# assign data
dataFrame = pd.DataFrame({'Name': [' RACHEL ', ' MONICA ', ' PHOEBE ',
' ROSS ', 'CHANDLER', ' JOEY '],
'Age': [30, 35, 37, 33, 34, 30],
'Salary': [100000, 93000, 88000, 120000, 94000, 95000],
'JOB': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY',
'IT', 'ARTIST']})
# filter dataframe
display(dataFrame.query('Salary <= 100000 & Age < 40 & JOB.str.startswith("C").values'))
输出:
方法4:Pandas布尔索引多条件标准方式(”布尔索引 “只对一列中的值起作用)
在这种方法中,我们从数据框中得到所有工资小于或等于100000,年龄小于40,工作以’P’开头的行。为了使用数据框架中的值来选择数据子集,并应用布尔条件,我们需要遵循以下方法
# import module
import pandas as pd
# assign data
dataFrame = pd.DataFrame({'Name': [' RACHEL ', ' MONICA ', ' PHOEBE ',
' ROSS ', 'CHANDLER', ' JOEY '],
'Age': [30, 35, 37, 33, 34, 30],
'Salary': [100000, 93000, 88000, 120000, 94000, 95000],
'JOB': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY',
'IT', 'ARTIST']})
# filter dataframe
display(dataFrame[(dataFrame['Salary']>=100000) & (dataFrame['Age']<40) & dataFrame['JOB'].str.startswith('P')][['Name','Age','Salary']])
输出:
我们提到了一个需要被检索的列的列表以及布尔条件,由于许多条件,它有’&’。
**方法5:评估多个条件(”评估 “和 “查询 “只适用于列) **
在这里,我们从数据框中得到所有工资小于或等于100000,年龄小于40,工作以’A’开头的记录。
# import module
import pandas as pd
# assign data
dataFrame = pd.DataFrame({'Name': [' RACHEL ', ' MONICA ', ' PHOEBE ',
' ROSS ', 'CHANDLER', ' JOEY '],
'Age': [30, 35, 37, 33, 34, 30],
'Salary': [100000, 93000, 88000, 120000, 94000, 95000],
'JOB': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY',
'IT', 'ARTIST']})
# filter dataframe
display(dataFrame[dataFrame.eval("Salary <=100000 & (Age <40) & JOB.str.startswith('A').values")])
输出:
数据框是Python中一个非常重要的概念,对数据的过滤需要根据不同的条件来进行。它们可以通过上述任何一种方式实现。需要注意的庞杂问题。
- loc与列标签和索引一起工作。
- eval和query只对列起作用。
- 布尔索引只对一列中的值起作用。