1. 程式人生 > 其它 >Python學習筆記:pandas篩選資料

Python學習筆記:pandas篩選資料

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

參考連結:一次性總結了pandas提取資料的15種方法,統統只需1行程式碼!

參考連結:[353]python3中新函式(gt,ge,eq,le,lt)替代Python2中cmp()函式