其他
pandas | 使用 df.query 字符串表达式进行数据筛选
数据分析中筛选是一个很重要的操作,在pandas.DataFrame中如何进行筛选,今天简单分享一下。
一、读入数据
import pandas as pd
df = pd.read_excel('data.xlsx')
df
Run
| | birthday | name | text | age | gender | height | weight |
| 0 | 1985/10/08 | Alice | 我很开心,每天都这么快乐,我很幸福 | 35 | female | 175 | 55 |
| 1 | 95.07.07 | Mary | 我很难过 | 25 | female | 165 | 50 |
| 2 | 01-11-10 | Mike | 唉,真难受 | 19 | male | 180 | 75 |
| 3 | 90/2/8 | Smith | 无所谓开心还是难过 | 30 | male | 175 | 70 |
| 4 | 93-1-5 | Henry | 每天赚一万,真爽! | 27 | male | 185 | 80 |
| 5 | 1988/2/9 | William | 爽歪歪 | 32 | male | 177 | 76 |
| 6 | 1986-03-21 | Will | 天气很凉爽,很舒服 | 34 | male | 180 | 85 |
| 7 | 1984.06.9 | Qunique | 每天开心 | 36 | female | 168 | 62 |
| 8 | 1993.07.09 | Sara | 难过悲伤 | 27 | female | 175 | 66 |
| 9 | 92/08/09 | Hillary | 美满幸福 | 28 | male | 190 | 85 |
#字段的数据类型
df.dtypes
birthday object
name object
text object
age int64
gender object
height int64
weight int64
dtype: object
二、筛选
查询符合条件的记录, 有两种实现方法
方法1 逻辑布尔值直接传入df[]
方法2 在query方法中传入字段表达式
2.1 方法1
逻辑布尔值直接传入df[]
筛选出年龄大于25岁,身高165以上, 且 为女性的记录
#df[(df['age'] > 25) & (df['height'] > 165) & (df['gender'] == 'female')]
df[(df.age > 25) & (df.height > 165) & (df.gender=='female')]
Run
| | birthday | name | text | age | gender | height | weight |
| 0 | 1985/10/08 | Alice | 我很开心,每天都这么快乐,我很幸福 | 35 | female | 175 | 55 |
| 7 | 1984.06.9 | Qunique | 每天开心 | 36 | female | 168 | 62 |
| 8 | 1993.07.09 | Sara | 难过悲伤 | 27 | female | 175 | 66 |
2.2 方法2
在query方法中传入字段表达式
筛选出年龄大于25岁,身高165以上, 且 为女性的记录
df.query('(age > 25) & (height > 165) & (gender == "female")')
Run
| | birthday | name | text | age | gender | height | weight |
| 0 | 1985/10/08 | Alice | 我很开心,每天都这么快乐,我很幸福 | 35 | female | 175 | 55 |
| 7 | 1984.06.9 | Qunique | 每天开心 | 36 | female | 168 | 62 |
| 8 | 1993.07.09 | Sara | 难过悲伤 | 27 | female | 175 | 66 |
可见query让查询和筛选代码变的很简洁,代码更具可阅读性和理解性。
但如果条件中使用了变量该如何撰写?
三、query表达式中的变量
query字符串表达式中如果含有变量 var
, 需要在该变量前加 @
,
即在query字符串表达式中 @var
可以调用表达式字符串外的变量var
min_age = 25
#年龄大于25
df.query('age > @min_age')
Run
| | birthday | name | text | age | gender | height | weight |
| 0 | 1985/10/08 | Alice | 我很开心,每天都这么快乐,我很幸福 | 35 | female | 175 | 55 |
| 3 | 90/2/8 | Smith | 无所谓开心还是难过 | 30 | male | 175 | 70 |
| 4 | 93-1-5 | Henry | 每天赚一万,真爽! | 27 | male | 185 | 80 |
| 5 | 1988/2/9 | William | 爽歪歪 | 32 | male | 177 | 76 |
| 6 | 1986-03-21 | Will | 天气很凉爽,很舒服 | 34 | male | 180 | 85 |
| 7 | 1984.06.9 | Qunique | 每天开心 | 36 | female | 168 | 62 |
| 8 | 1993.07.09 | Sara | 难过悲伤 | 27 | female | 175 | 66 |
| 9 | 92/08/09 | Hillary | 美满幸福 | 28 | male | 190 | 85 |
g = 'female'
min_age = 25
min_height = 165
#筛选出年龄大于25岁,身高165以上, **且** 为女性的记录
df.query('(age > @min_age) & (height > @min_height) & (gender == @g)')
Run
| | birthday | name | text | age | gender | height | weight |
| 0 | 1985/10/08 | Alice | 我很开心,每天都这么快乐,我很幸福 | 35 | female | 175 | 55 |
| 7 | 1984.06.9 | Qunique | 每天开心 | 36 | female | 168 | 62 |
| 8 | 1993.07.09 | Sara | 难过悲伤 | 27 | female | 175 | 66 |
精选文章
管理世界 | 使用 「经营讨论与分析」 测量 「企业数字化指标」
PNAS | 使用语义距离测量一个人的「创新力(发散思维)得分」
27G数据集 | 使用Python对27G招股说明书进行文本分析
安装python包出现报错:Microsoft Visual 14.0 or greater is required. 怎么办?