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