Python基础 | pandas中数据的筛选(index & subset)
参考资料:
pandas Indexing and selecting data
本文数据可在此处下载,密码:vwy3
# 加载数据
import pandas as pd
# 数据是之前在cnblog上抓取的部分文章信息
df = pd.read_csv('./data/SQL测试用数据_20200325.csv',encoding='utf-8')
df.head(3)
筛选列
相当于SQL中的select
所有列
df
df[:]
某一列
df.col_name
列名必须是字符串格式且不含空格df['col_name']
- 第N列,
df.iloc[:,[1,3,4]]
- 先获取列名列表,再指定index,
df[df.columns[0]]
选择多列
- 指定列名称,
df['col_1','col_2']
,或者df.loc[:,['col_1','col_2']]
- 指定列顺序,
df[df.columns[1,3,4]]
或df.iloc[:,[1,3,4]]
- 列名称符合某种规则,比如相同的前缀,那么可以先得到列名称,然后进行判断筛选相应的列名
df.filter(regex='^h')
以h开头的字段名称对应的列
df.filter(regex='^h')
筛选行
相当于SQL中的where
按行的顺序
- 前3行,
df_data.head(3)
- 后3行,
df_data.tail(3)
- 指定index,
- 选择行
df.iloc[:3]
和head(3)的效果是一样的 - 选择列
df.iloc[:,:3]
选择前3列 - 单元格定位
df.iloc[0,1]
选择第1行第2列的单元格数值 - 选择区域,
df.iloc[[:3],[:3]]
前3行,前3列
- 选择行
- 指定行index,
df.loc[[row_index],[col_names]]
# 选择前3行
df.iloc[:3]
# 选取列 href的数据,只取index为1,3,5的数据,
df.loc[[1,3,5],['href']]
抽样(行)
df.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
- n 样本数量
- frac 比例
- replace 是否放回,一般是无放回抽样(函数默认值)
- weight 权重
# 随机抽取3行数据
df.sample(n=3)
# 随机抽5‰的行
df.sample(frac=0.005)
最大(小)值
# 阅读量最低的5篇文章的信息
df.nsmallest(5,'read_cnt')
# 阅读量最高的5篇文章的信息
df.nlargest(5,'read_cnt')
按值的判断
- 字符串匹配,包括
精确匹配
和模糊匹配
- 数值区间
=,>,<(值的比较)
# 筛选博客名称为'wupeixuan'的行
# 注意对标题字母统一转成小写
df[df['blog_name'] == 'wupeixuan']
# .query方法
df.query('blog_name == "wupeixuan"')
# 阅读数大于5000的文章信息
df[df['read_cnt'] > 5000]
# 阅读量在1000-5000这个区间的文章数量
df[(df['read_cnt'] >= 1000) & (df['read_cnt'] <= 5000)].shape[0]
# .query方法
df.query('1000 <= read_cnt <= 5000').shape[0]
输出:
65
df.query
看起来和sql更相似,也更直观
该方法对于如下操作是有效的:
- =,>,<
==
- and,or
and, or, &, |
- not 只能应用到bool值的列
- in,not in
in, not in
注意点:
- 字符串取值要用双引号
- 逻辑关键字
and,or,not(或且非)
# 星期1发布且(&)阅读量>5000的文章
df[(df['weekday']==1) & (df['read_cnt']>5000)]
df.query('weekday==1 and read_cnt>5000')
df.query('weekday==1 & read_cnt>5000')
# 标题中含有'5000' 或(|) 阅读量>5000的文章
df[(df['title'].str.contains('5000')) | (df['read_cnt']>5000)]
# 不看阅读量<5000的文章
# 也就是只看阅读量>=5000的文章
df[~(df['read_cnt']<5000)]
like(字符串匹配)
包含某字符,相当于SQL中的%like%
# 筛选标题中含有‘Jupyter’的行
# 如果是英文字母可以考虑对标题字母统一转成小写或大写
df[df['title'].str.contains('Jupyter')]
# 字符串的正则匹配
# 筛选标题中同时含有'Python'和'数据分析'的行
df[df['title'].apply(lambda x:x.lower()).str.contains('python.*数据分析')]
# 筛选标题中含有'Kmeans'或'梯度下降'的行
df[df['title'].str.contains('Kmeans|梯度下降')]
# 组合用法
df[df['title'].str.contains('机器学习.*(Kmeans|梯度下降)')]
in(取值的集合)
# in
# 阅读量刚好是333或者999的文章信息
df[df['read_cnt'].isin([333,999])]
# query方法
df.query('read_cnt in [333,999]')
# not in
# ~ 和 .isin组合集合
# 只看星期天的发文数量
df[~df['weekday'].isin([1,2,3,4,5,6])].shape[0]
df.query('weekday not in [1,2,3,4,5,6]').shape[0]
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
转载请注明作者及出处