pandas 拥有强大的数据清洗能力,可以极大的简化数据处理工作。
一、数据加载及EDA
import os
os.chdir(r\'C:\Users\111\Desktop\')
# 加载数据
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(\'301\d{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函数