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函数