Python基礎 | pandas中數據的篩選(index & subset)


參考資料
pandas Indexing and selecting data

本文數據可在此處下載,密碼:vwy3

# 加載數據
import pandas as pd

# 數據是之前在cnblog上抓取的部分文章信息
df = pd.read_csv('./data/SQL測試用數據_20200325.csv',encoding='utf-8')

df.head(3)

篩選列

相當於SQL中的select

所有列

  • df
  • df[:]

某一列

  • df.col_name 列名必須是字符串格式且不含空格
  • df['col_name']
  • 第N列,
    • df.iloc[:,[1,3,4]]
    • 先獲取列名列表,再指定index,df[df.columns[0]]

選擇多列

  • 指定列名稱,df['col_1','col_2'],或者 df.loc[:,['col_1','col_2']]
  • 指定列順序,df[df.columns[1,3,4]]df.iloc[:,[1,3,4]]
  • 列名稱符合某種規則,比如相同的前綴,那么可以先得到列名稱,然后進行判斷篩選相應的列名
    • df.filter(regex='^h') 以h開頭的字段名稱對應的列
df.filter(regex='^h')

篩選行

相當於SQL中的where

按行的順序

  • 前3行,df_data.head(3)
  • 后3行,df_data.tail(3)
  • 指定index,
    • 選擇行df.iloc[:3] 和head(3)的效果是一樣的
    • 選擇列 df.iloc[:,:3] 選擇前3列
    • 單元格定位 df.iloc[0,1] 選擇第1行第2列的單元格數值
    • 選擇區域,df.iloc[[:3],[:3]] 前3行,前3列
  • 指定行index,df.loc[[row_index],[col_names]]
# 選擇前3行
df.iloc[:3]
# 選取列 href的數據,只取index為1,3,5的數據,
df.loc[[1,3,5],['href']]

抽樣(行)

df.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

  • n 樣本數量
  • frac 比例
  • replace 是否放回,一般是無放回抽樣(函數默認值)
  • weight 權重
# 隨機抽取3行數據
df.sample(n=3)

# 隨機抽5‰的行
df.sample(frac=0.005)

最大(小)值

# 閱讀量最低的5篇文章的信息
df.nsmallest(5,'read_cnt')

# 閱讀量最高的5篇文章的信息
df.nlargest(5,'read_cnt')

按值的判斷

  • 字符串匹配,包括精確匹配模糊匹配
  • 數值區間

=,>,<(值的比較)

# 篩選博客名稱為'wupeixuan'的行
# 注意對標題字母統一轉成小寫
df[df['blog_name'] == 'wupeixuan']

# .query方法
df.query('blog_name == "wupeixuan"')
# 閱讀數大於5000的文章信息
df[df['read_cnt'] > 5000]
# 閱讀量在1000-5000這個區間的文章數量
df[(df['read_cnt'] >= 1000) & (df['read_cnt'] <= 5000)].shape[0]

# .query方法
df.query('1000 <= read_cnt <= 5000').shape[0]

輸出:
65

df.query看起來和sql更相似,也更直觀

該方法對於如下操作是有效的:

  • =,>,< ==
  • and,or and, or, &, |
  • not 只能應用到bool值的列
  • in,not in in, not in

注意點:

  • 字符串取值要用雙引號
  • 邏輯關鍵字

and,or,not(或且非)

# 星期1發布且(&)閱讀量>5000的文章
df[(df['weekday']==1) & (df['read_cnt']>5000)]

df.query('weekday==1 and read_cnt>5000')

df.query('weekday==1 & read_cnt>5000')
# 標題中含有'5000' 或(|) 閱讀量>5000的文章
df[(df['title'].str.contains('5000')) | (df['read_cnt']>5000)]
# 不看閱讀量<5000的文章
# 也就是只看閱讀量>=5000的文章
df[~(df['read_cnt']<5000)]

like(字符串匹配)

包含某字符,相當於SQL中的%like%

# 篩選標題中含有‘Jupyter’的行
# 如果是英文字母可以考慮對標題字母統一轉成小寫或大寫
df[df['title'].str.contains('Jupyter')]
# 字符串的正則匹配

# 篩選標題中同時含有'Python'和'數據分析'的行
df[df['title'].apply(lambda x:x.lower()).str.contains('python.*數據分析')]

# 篩選標題中含有'Kmeans'或'梯度下降'的行
df[df['title'].str.contains('Kmeans|梯度下降')]


# 組合用法

df[df['title'].str.contains('機器學習.*(Kmeans|梯度下降)')]

in(取值的集合)

# in
# 閱讀量剛好是333或者999的文章信息
df[df['read_cnt'].isin([333,999])]

# query方法
df.query('read_cnt in [333,999]')
# not in 
# ~ 和 .isin組合集合

# 只看星期天的發文數量
df[~df['weekday'].isin([1,2,3,4,5,6])].shape[0]

df.query('weekday not in [1,2,3,4,5,6]').shape[0]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM