Python pandas 數據篩選與賦值升級版詳解

數據篩選背景

在處理數據時,我們可能希望從數據庫里面篩選出符合特定條件的記錄(個案或樣本,不同的行業叫法不一樣),平常大家對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.位運算符&|,而不是邏輯運算符 andor,兩者是有區別的
data.loc[(data['A'].str.contains('團隊')) and (data['B']>=40)]
位運算符

2.缺少括號()導致篩選不出數據,但是不報錯

data.loc[data['A'].str.contains('團隊') & data['B']>=40]
缺少括號

經過多方查找原因,動手實踐,這個問題貌似沒有帖子仔細進行解釋,那這是為什么篩選不出來數據呢,加了括號就可以,可能有同學一下子就明白了,運算符的順序,對,位運算符&的優先級 高于 比較運算符>=,其實也就是只對后面的條件加上括號即可,但是考慮到邏輯嚴謹性,最好把所有條件都括起來,詳情參考這篇文章Python 3 的運算符及優先級


pandas賦值操作

#賦值操作
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 的原理和解決方案


以上是自己實踐中遇到的一些點,分享出來供大家參考學習,避免再出現錯誤,以及出錯后不知道哪里出錯、什么原因等,歡迎關注本簡書號

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。