數據篩選背景
在處理數據時,我們可能希望從數據庫里面篩選出符合特定條件的記錄(個案或樣本,不同的行業叫法不一樣),平常大家對Excel篩選很熟悉,比如從A字段(變量或特征)包含“團隊”,B字段大于等于40,篩選出符合這兩個條件的記錄,如下圖所示:
excel數據篩選
pandas處理
- 正確代碼
#加載庫
import pandas as pd
import numpy as np
#讀取數據
data=pd.read_excel('test.xlsx')
#查看數據類型
data.dtypes
#查看數據前5行
data.head()
#根據條件篩選出數據
data.loc[(data['A'].str.contains('團隊')) & (data['B']>=40)]
#data[(data['A'].str.contains('團隊')) & (data['B']>=40)] #這兩行都可以
結果示例
-
錯誤代碼
1.位運算符&
與|
,而不是邏輯運算符and
與or
,兩者是有區別的
data.loc[(data['A'].str.contains('團隊')) and (data['B']>=40)]
位運算符
2.缺少括號()
,導致篩選不出數據,但是不報錯
data.loc[data['A'].str.contains('團隊') & data['B']>=40]
缺少括號
經過多方查找原因,動手實踐,這個問題貌似沒有帖子仔細進行解釋,那這是為什么篩選不出來數據呢,加了括號就可以,可能有同學一下子就明白了,運算符的順序
,對,位運算符&
的優先級 高于 比較運算符>=
,其實也就是只對后面的條件加上括號即可,但是考慮到邏輯嚴謹性,最好把所有條件都括起來
,詳情參考這篇文章Python 3 的運算符及優先級
pandas賦值操作
-
正確代碼
注意避免鏈式操作導致SettingwithCopyWarning
,最詳細的解釋,請參考這篇文章Pandas 中 SettingwithCopyWarning 的原理和解決方案
#賦值操作
data.loc[(data['A'].str.contains('團隊')) & (data['B']>=40),'C']='是'
data
賦值操作
及時原來的數據框里面沒有C列變量,但是在賦值時可以直接指定,數據框會自動生成這一列變量
-
錯誤代碼
1.缺少.loc
導致報錯提示不可哈希,對這個不是很懂
data[(data['A'].str.contains('團隊')) & (data['B']>=40),'C']='是'
缺少 .loc
建議為了使代碼規范,在根據條件篩選時就把
.loc
帶上,防止后期出錯
2.鏈式操作,提示SettingwithCopyWarning
data.loc[(data['A'].str.contains('團隊')) & (data['B']>=40)]['C']='是'
data
鏈式操作
為什么會出現這種情況,請詳細閱讀這篇文章Pandas 中 SettingwithCopyWarning 的原理和解決方案
以上是自己實踐中遇到的一些點,分享出來供大家參考學習,避免再出現錯誤,以及出錯后不知道哪里出錯、什么原因等,歡迎關注本簡書號