pandas選擇部分數據,難!你該這麼學,No.12

最近划水嚴重了

看了一下,上一篇博客,6月11日寫的,一晃一個月+10天過去了

這兩個月,嚴重的挑釁了勞動法

每週從週一,工作到週日,每天從早上8點,忙到晚上23:00

哪個大佬,給個渠道

投訴一下老闆…

在這裏插入圖片描述

工作一忙,就溜號了,回頭跟老闆說說,都沒時間寫博客

刷存在感了

看了一下,pandas這個系列的博客還沒有寫完,so繼續拿這個開始吧

斷更了一段時間,需要找找狀態

今天就從索引和檢索數據開始

這個簡單吧,寫寫你就知道了,

哪裏有簡單的事情

索引選擇的幾種方式

pandas支持三種類型的多軸索引

類型 簡單描述
.loc 基於標籤
.iloc 基於位置
[ ] 切片操作

那麼我們先講 .loc吧

這個是基於標籤的,嘖嘖嘖,什麼是標籤

看圖

import pandas as pd
my_series = pd.Series(data = ['我','是','夢想','橡皮擦'],index=['a','b','c','d'],name='夢想序列')
print(my_series)

在這裏插入圖片描述
就是代碼裏面的index,是不是清晰明瞭了?

.loc 就是操作樓上這東西的

它有哪些取值呢,這就多了,官方手冊給了5個

我們細細的品讀一下

在這裏插入圖片描述
1st. 看我這英文水平
1st. 單獨的一個標籤,例如2或者'a',請注意這個地方的2是索引的標籤值,不是整數的位置
啥意思,看操作

我截取了部分代碼
在這裏插入圖片描述
注意,loc['b']對應的是b行,loc[2]對應的是2行,這個2可不是索引2,實打實的是 index 的 label 2

當然這個地方,我只是單純的做個測試,index的label建議是字符串哦
或者,你要不都是字符串,要不都是整數,明白乎?
這樣方便後面的許多運算滴

2nd. 一個標籤列表

這個就好解釋了

# 獲取2行
print(my_series.loc[['a','b']])

你看,得到結果了吧,但是,請注意 .loc[] 裏面是標籤列表,所以要寫成 .loc[['a','b']]

別弄差了 寫成 .loc[‘a’,‘b’]

會報錯的哦~

3rd. 一個切片對象例如標籤 'a':'d' 這個地方有一個要注意,在python列表索引中

切片是不包括結尾的,但是這個地方包括哦

例子如下

# 獲取a~d行
print(my_series.loc['a':'d'])

4th. 一個布爾數組,這個和2nd像哦
當碰到數組中是True,就打印出來,簡單吧

不過,請記住,不要超過數組的長度

print(my_series.loc[[True,False,True,True]])

還有,記住這個地方,可別自作聰明的認爲True等價於1

把上面的代碼轉換成

在這裏插入圖片描述
具體原因,看2nd去吧

在這裏插入圖片描述
5th. 第5個就比較厲害了,可以放一個函數,這個函數有一個參數,參數類型是 Series, DataFrame,Panel中的一個,還要返回上述的幾個類型

恩,有點難度,常規套路

不想寫了

後來想想,不寫還能叫大佬麼

寫出來給你看看

import pandas as pd

my_series = pd.Series(data = ['我','是','夢想','橡皮擦'],index=['a','b','c','d'],name='夢想序列')

def fun():
    return 'a';

print(my_series.loc[fun()])

這個地方補充一個知識點

如果比較一個series對象一個字符串,會出現一個什麼樣的結果呢

例如

比較剛纔的my_series

my_series = pd.Series(data = ['我','是','夢想','橡皮擦'],index=['a','b','c','d'],name='夢想序列')

print(my_series == '我')

得到的結果是還是一個Series

但是每個值的類型都變成了bool,這樣子,我們可以做一些下面的操作了

運行下面的代碼,領悟裏面的精髓吧,哈哈哈

def fun():
    return 'a';
def fun1():
    return ['a','b'];

def fun2(s):

    return s=="我"

print(my_series.loc[fun()])
print(my_series.loc[fun1()])
print(my_series.loc[fun2(my_series)])

在這裏插入圖片描述
當然,還可以使用lamda表達式,畢竟上面的函數體還是有點簡單的嗎

print("*"*100)
print(my_series.loc[fun()])
print(my_series.loc[lambda s:'a'])
print("*"*100)
print(my_series.loc[fun1()])
print(my_series.loc[lambda s:['a','b']])
print("*"*100)
print(my_series.loc[fun2(my_series)])
print(my_series.loc[lambda s:s=='我'])

安排的明明白白

相同的操作,除了給series使用之外,對於我們來說dataframe纔是正戲呢

df = pd.DataFrame([[4,8,3],[5,6,1],[1,9,2]],columns=['boys','girls','guys'],index=['class2','class1','class3'])
def fuu(df):
    return df['boys']>2

print(df.loc['class1'])
print(df.loc[['class1','class2']])
print(df.loc[fuu(df)])


print(df['boys']>2)

看細節了沒,df操作和series是一致的哦

還有,我在上面的代碼中寫了一個df['boys']>2哦,看一下返回的結果吧

如果你喜歡,你可以自己嘗試一下lamda的用法,也很簡單的哦

小提示

當你選擇完數據之後,如果數據還是多行的,其實可以繼續選擇的

print(my_series.loc[lambda s:['a','b']]['a']) 
# 或者
print(my_series.loc[lambda s:['a','b']].loc['a'])

.loc 用在dataframe上,還可以這麼操作,請查收

df = pd.DataFrame([[4,8,3],[5,6,1],[1,9,2]],columns=['boys','girls','guys'],index=['class2','class1','class3'])
print(df.loc[:,:])  # 切片,逗號前是index,後面是columns
print(df.loc[:,'boys':'girls'])
print(df.loc[['class1','class2'],['boys']])

技術在手,想怎麼寫就怎麼寫

繼續第二種

這種如果你去官方文檔檢索,稱作 Selection by Position

pandas提供了一套方法,用整數索引獲取數據

索引使用和列表中切片保持一致,基於–based索引,當切片時,左閉右開。

.loc 主要訪問方法

  1. 整數,例如1,2,3,
  2. 整數列表或者數組[4,3,1]
  3. 切片對象,是整數
  4. 布爾數組
  5. 可回調函數

我們首先通過 iloc獲取一下第2行的數據,索引當然是從0開始啦

df.iloc[1]

獲取到的數據爲`Series

在這裏插入圖片描述
切片你也可以自己試一下,沒啥問題的

最後一步,Selection by callable

作爲大佬的我,就不寫了,你可以搜索一下,難度係數不大不小

啥叫不大不小呢
在這裏插入圖片描述
你如果會使用lambda就不大,不會就不小

機制的博主邏輯能力如何??

你還可以去上一篇博客,然後拉到最底部,發現一個好東西,然後掏出手機,拍一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章