最近划水嚴重了
看了一下,上一篇博客,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,2,3,
- 整數列表或者數組[4,3,1]
- 切片對象,是整數
- 布爾數組
- 可回調函數
我們首先通過 iloc
獲取一下第2行的數據,索引當然是從0開始啦
df.iloc[1]
獲取到的數據爲`Series
切片你也可以自己試一下,沒啥問題的
最後一步,Selection by callable
作爲大佬的我,就不寫了,你可以搜索一下,難度係數不大不小
啥叫不大不小呢
你如果會使用lambda就不大,不會就不小
機制的博主邏輯能力如何??
你還可以去上一篇博客,然後拉到最底部,發現一個好東西,然後掏出手機,拍一下