python pandas数据筛选
0 背景
之前提到过WPS支持python: WPS支持python, 也对pandas
提到了一些基础的操作, 因此, 本文依旧主要借助WPS平台对pandas的数据进行一些筛选查询操作。
1 使用
初始化数据
在WPS中初始化数据:
df = xl("$A$1:$G$18", headers=True, sheet_name="工作表1")
# 设置索引为uid列
df.set_index('uid',inplace=True)
print(df.head())
在python中初始化数据:
data = {
"uid": [1, 2, 3, 4, 5, 6, 7, 8, 9],
"uname": ["雷嘉伦", "杜睿", "孙晓明", "方宇宁", "彭睿", "苏詩涵", "宋子异", "彭震南", "钟宇宁"],
"usex": ["男", "男", "男", "男", "男", "女", "男", "男", "男"],
"uage": [79, 83, 19, 31, 18, 71, 47, 55, 59],
"umail": ["lj712@mail.com", "ruidu@hotmail.com", "xiaomsun@gmail.com", "", "pengrui910@icloud.com", None, "ziyso@gmail.com", "zhepeng404@gmail.com", "yuningzhong407@hotmail.com"],
"ucity": ["洛杉矶", "广州市", "纽约", "深圳", "纽约", "东莞", "中山", "阿克伦", "芝加哥"],
"udate": ["2001/11/13", "2002/5/7", "2010/8/9", "2018/12/17", "2017/4/3", "2021/1/20", "2001/6/18", "2016/2/17", "2014/3/15"]
}
df = pd.DataFrame(data)
df.set_index('uid', inplace=True)
布尔索引
单个条件
筛选性别为女的数据
# 筛选性别为女的数据
df[df['usex']=='女']
筛选邮箱是空(NaN)的数据
会筛选NaN以及None的数据
# 筛选邮箱是空(NaN,None)等的数据
df[df['umail'].isna()]
# 筛选邮箱是空(None)的数据
df[df['umail'].isnull()]
多个条件
筛选性别为女, 而且年龄小于30的数据
# 筛选性别为女, 而且年龄小于30的数据
df[(df['uage'] < 30) & (df['usex'] == '女')]
筛选性别为女, 或者年龄小于30的数据
# 筛选性别为女, 或者年龄小于30的数据
df[(df['uage'] < 30) | (df['usex'] == '女')]
非, 城市不是深圳的数据
# 非
df[~(df['ucity']=='深圳')]
isin()
筛选城市在广州或者深圳的数据
# 使用`isin()`筛选城市在广州或者深圳的数据
df[df['ucity'].isin(['广州市','深圳'])]
复杂的条件筛选, 其他不符合的值为空
# 复杂的条件筛选, 其他不符合的值为空
df[df.isin({'ucity': ['广州市','深圳'], 'usex':['男']})]
uname usex uage umail ucity udate
uid
1 NaN 男 NaN NaN NaN NaN
2 NaN 男 NaN NaN 广州市 NaN
3 NaN 男 NaN NaN NaN NaN
4 NaN 男 NaN NaN 深圳 NaN
...
query()
df.query(expr)
函数是一个非常方便的数据筛选的方法,它允许我们使用字符串形式的表达式来查询DataFrame中的数据, 。表达式是一个字符串,类似于SQL中的where从句,使用非常灵活。
df.query('usex == "男"')
df.query('uage < 30')
df.query('(usex == "男") | (uage < 30)')
df.query('(usex == "男") & (uage < 30)')
df.query('(usex == "男") and (uage < 30)')
df.query('ucity in ("广州市","深圳")')
df.query('ucity not in ("广州市","深圳")')
df.query('usex != "男"')
# uid就是索引的字段名称
df.query('uid > 10')
df.query('index > 10')
# 使用外部变量, 使用@标识
uage = 22
result = df.query('uage < @uage')
eval()
df.eval()
与df.query()
类似,也用于表达式筛选.
df[df.eval('usex == "男"')]
df[df.eval('uage < 30')]
df[df.eval('(usex == "男") | (uage < 30)')]
df[df.eval('(usex == "男") & (uage < 30)')]
filter()
df.filter()
可以在行名和列名进行筛选,支持模糊匹配、正则表达式。
# 选择姓名和城市两列
df.filter(items=['uname', 'ucity'])
# 获取列名中包含ag的数据(uage)
df.filter(regex='ag', axis=1)
df.filter(like='ag', axis=1)
# 获取行索引中包含2的数据, (2,12)的数据
df.filter(like='2', axis=0)
# 获取行索引中开头是2的数据, (2)的数据
df.filter(regex='^2', axis=0)
select_dtypes()
pandas
提供了一个按列数据类型筛选的功能 df.select_dtypes(include=None, exclude=None)
,它可以指定包含和不包含的数据类型,如果只有一个类型,可以传入字符;如果有多个类型,可以传入列表。
df.select_dtypes(include=['number'])
df.select_dtypes(include=['number','object'])
df.select_dtypes(exclude=['object'])
可以通过df.dtypes
查看数据类型.
2 关于
欢迎关注我的微信公众号
原文始发于微信公众号(其之):python pandas数据筛选
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204808.html