Python学习笔记:pandas筛选数据

pandas 拥有强大的数据清洗能力,可以极大的简化数据处理工作。

一、数据加载及EDA

import os
os.chdir(r'C:Users111Desktop') 

# 加载数据
import pandas as pd
df = pd.read_excel("超市运营数据模板.xlsx")
df.head()
'''
	商品ID	类别ID	门店编号	单价	销量	订单ID	日期	时间
0	30006206	915000003	CDNL	25.23	0.328	20201003CDLG000210052759	2011-01-03	09:56
1	30163281	914010000	CDNL	2.0	2.0	20201003CDLG000210052759	2011-01-04	09:56
2	30200518	922000000	CDNL	19.62	0.23	20201003CDLG000210052759	2011-01-05	09:56
3	29989105	922000000	CDNL	2.8	2.044	20201003CDLG000210052759	2011-01-06	09:56
4	30179558	915000100	CDNL	47.41	0.226	20201003CDLG000210052759	2011-01-07	09:56
'''

# 处理日期字段
import datetime
df['日期'] = df['日期'].values.astype('datetime64')
start_date = datetime.datetime.strptime('2020-04-30', '%Y-%m-%d').date() # 起始
end_date = datetime.datetime.strptime('2020-06-01', '%Y-%m-%d').date() # 结束

# EDA 数据探索
df.dtypes
df.门店编号.value_counts()
'''
CDLG    1331
CDXL    1148
CDNL     999
Name: 门店编号, dtype: int64
'''

二、比较运算:“<”、">"、"=="、"<="、">="、"!="

# 1.“==” 筛选
df2 = df[df.门店编号 == 'CDXL']

# 2.“<=” 比较运算符
df4 = df[df.单价 <= 10]

# 3.“>=” 比较运算符
df6 = df[df.销量 >= 5]

# 4.“!=” 比较运算符
df8 = df[df.门店编号 != 'CDXL']

三、比较函数:eq、ne、le、lt、ge、gt

python3 中新函数 gt/ge/eq/le/lt 替代 python2 中的 cmp 函数。

# 等同于比较运算符号 一一对应
eq -- equal(等于)
ne -- not equal(不等于)
le -- less and equal(小于等于)
lt -- lest than(小于)
ge -- greater and equal(大于等于)
gt -- greater than(大于)

实操:

# 1.eq函数 比较函数
df3 = df[df['门店编号'].eq('CDXL')]

# 2.le函数 比较函数
df5 = df[df['单价'].le(10)]

# 3.ge函数 比较函数
df7 = df[df['销量'].ge(5)]

# 4.ne函数 比较函数
df9 = df[df['门店编号'].ne('CDXL')]

# 5.Pandas.datetime64[ns] 不能直接与 datetime.date 比较
# 需要通过 pd.Timestamp 转化
df10 = df[(df.日期 > pd.Timestamp(start_date)) & (df.日期 < pd.Timestamp(end_date))]

# 6.gt lt &
df11 = df[(df['日期'].gt(pd.Timestamp(start_date))) & (df['日期'].lt(pd.Timestamp(end_date)))]

四、范围运算:between(left, right)及apply

# apply函数
df12 = df[df['日期'].apply(lambda x: x.year == 2020 and x.month == 5)]

# between函数
df13 = df[df['日期'].between(pd.Timestamp(start_date), pd.Timestamp(end_date), inclusive=False)] # inclusive 参数可以设置边界

五、筛选包含:contains、isin、startswith、endswith

语法:contains(pat, case, flags, na, regex)

# contains函数 包含
df['类别ID'] = df['类别ID'].values.astype('str') # 转换为字符串类型
df14 = df[df['类别ID'].str.contains('000', na=False)] # 默认对空值不处理 即输出结果还是 NaN

df['商品ID'] = df['商品ID'].values.astype('str')
df15 = df[df['商品ID'].str.contains('301d{5}', na=False)] # 正则表达式
# startwith
df16 = df[df['商品ID'].str.startswith('301')]

# isin函数 是否在
df17 = df[df['类别ID'].isin(['000'])] # 输入列表
# 只能判断元素是否在列表中 无法判断包含 即 like 模式

六、逻辑运算:&(与)、|(或)、!(非)

使用 &(且) 和 |(或) 时每个条件都要用小括号括起来

df[(df['price'] >= 100) & df['price'] < 200]

选取多列一定是两个方括号,其中内侧方括号代表是一个list

df[['name', 'price']][df['price'] > 200]
df.loc[df['price'] >200, (['name', 'price'])] # 使用iloc loc函数

某列等于多个数值、多个字符串

df[df['price'].isin([10, 20, 30])]
df.loc[(df['price'] == 10) | (df['price'] == 20) | (df['price'] == 30)] # 使用iloc loc函数

参考链接:一次性总结了pandas提取数据的15种方法,统统只需1行代码!

参考链接:[353]python3中新函数(gt,ge,eq,le,lt)替代Python2中cmp()函数

原文地址:https://www.cnblogs.com/hider/p/15304726.html