Python學習筆記:pandas篩選資料
阿新 • • 發佈:2021-09-17
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函式