2020-04-19 pandas索引與數據篩選

import seaborn as sns
import pandas as pd
import numpy as np

Pandas Indexing and Selecting

讓我們來討論一下pandas數據的切片和切分(slicing and dicing),類似于R里面的數據框或矩陣取子集氧秘。今天我們將復習四個主題:

  • 復習基礎知識
  • 多重索引
  • 獲取單個值
  • 一些不用在意的東西

關于基礎知識可以參考: basic indexing ,索引相關可參考 advanced indexing. 但要這些資料會很冗長趴久,他會提供一些你可能都用不到的方法丸相,或者沒有必要掌握的技能,自行選擇:

復習基礎知識

首先朋鞍,讓我們簡單回顧一下傳統(tǒng)的索引和篩選(indexing and selection)已添。(我們在pandas基礎知識pandas fundamentals中介紹了大部分內容)。首先滥酥,以下是我們將要使用的數據(舊的 tips 數據):
這個數據存放在:https://github.com/guipsamora/pandas_exercises/tree/master/07_Visualization/Tips

ls
?[31mCombining DataFrames.ipynb?[m?[m*            ?[31mPandas Intro to Data Structures.ipynb?[m?[m*
?[31mGroup Operations.ipynb?[m?[m*                ?[31mRow-Column Transformations.ipynb?[m?[m*
?[31mIndexing and Selecting.ipynb?[m?[m*          ?[31mtips.csv?[m?[m*
?[31mMisc Functions.ipynb?[m?[m*
tips = pd.read_csv('tips.csv')
tips.head()
image.png
del tips['Unnamed: 0']
tips.head(3)
image.png

下面介紹4種方式從數據框中獲取數據:

  1. 獲取不同的列
# 1) get columns
tips[['total_bill', 'tip']].head()
image.png
  1. 獲取不同的行
# 2) get some rows
tips[3:5]
image.png
  1. 根據行名列名獲取數據
# 3) select rows and columns based on their name
tips.loc[2:4, 'sex': 'smoker']
image.png
  1. 根據位置信息獲取數據
# 4) select rows and columns by their ordering
tips.iloc[1:3, 0:2]
image.png
  1. 根據邏輯值來篩選
# 5) select using a bool series
tips[tips['tip'] > 1].head()
image.png

不過這些僅僅是冰山一角更舞。

實際上,當你深入研究pandas的其他功能(functionalities)時坎吻,你很可能會涉及到其他幾個重要的概念缆蝉。

Multi-index

這是一個您可能認為不需要的主題--但事實證明它是一個相當頻繁的用例(usecase)。

multi-index背后的最初想法是提供一個框架來處理更高的模糊數據(從而取代panels)瘦真。
但由于一些操作刊头,這變得相當平常。在幾乎所有情況下诸尽,multi-index都來自groupby's(您幾乎不會自己構建或閱讀它)原杂。

下面我們舉個例子:

tips.head()
image.png
mi_tips = tips.groupby(['sex', 'smoker']).agg({'tip': 'mean'})
mi_tips
image.png
mi_tips.index
    MultiIndex([('Female',  'No'),
                ('Female', 'Yes'),
                (  'Male',  'No'),
                (  'Male', 'Yes')],
               names=['sex', 'smoker'])

最終,您可以在此類型的數據之上執(zhí)行大量操作您机。您還可以執(zhí)行等效的multi-index操作穿肄,如下所示:

mi_tips.loc[('Male', 'No')]
    tip    3.113402
    Name: (Male, No), dtype: float64

通過這種方式,你會學到很多細節(jié)际看,但是總會有例外咸产。

因此,我一直以來處理這個問題的方法很簡單仲闽,就是重置索引脑溢。

ri_tips = mi_tips.reset_index()
ri_tips
image.png

請注意我們現(xiàn)在是如何將值分布到整個column中的。因此赖欣,通過這種方式屑彻,很容易只選擇不吸煙的男性(the male non-smokers):

ri_tips[(ri_tips['smoker'] == 'No') & (ri_tips['sex'] == 'Male')]
image.png

處理此問題的另一種方法是只刪除某些索引:

ri0_tips = mi_tips.reset_index(level=0)
ri0_tips.loc['Yes']
image.png

然后如果再需要用到之前的索引验庙,還可以換回來,參考pull indexes back into the index (通常這個操作使用在某些類型數據合并的過程中)酱酬。

ri_tips.set_index(['sex', 'smoker'])
image.png
ri0_tips.set_index('sex', append=True)
image.png

獲取單個值

下一個索引小把戲(indexing trick)主要是關于速度的壶谒。它是在獲取和設置單一的值(使用后提升計算速度)。這是一個非常簡單的問題:

tips.head(3)
image.png

當需要獲取/設定單個值要用到at函數

tips.at[0, 'total_bill'] = 9000
tips.head(3)
image.png
tips.iat[0, 0]
    9000.0

如果您正在修改數據框的單個值膳沽,則應該始終使用這些工具汗菜。它速度更快,而且是知道您沒有搞砸的好方法(經常修改數據可能會導致奇怪的錯誤)挑社。

所以陨界,為了證明它更快,我們來計時吧痛阻!

%%timeit
tips.at[0, 'total_bill'] = 6
6.12 μs ± 46.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
tips.loc['total_bill', 0] = 6
272 μs ± 4.49 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

看上去at的速度比較快菌瘪。

Where, Masks and Queries

這些都是pandas內置的東西,我個人從來沒有用過阱当,主要是因為它們相當多余俏扩,而且不經常發(fā)生。

他們的速度要快一點弊添。但是感覺可能不值得這樣做录淡。所以,如果你想學油坝,就去學吧(文檔在here)嫉戚。如果不是,可能就無關緊要了澈圈。

下面讓我向您展示如何復制mask功能彬檀。

df = pd.DataFrame(np.random.randn(25).reshape((5, 5)))
df.head()
image.png
df.where(df > 0)
image.png
df[df < 0] = np.NaN
df
image.png

小結

這就是我所知道的關于索引的全部內容,并探索所有您需要知道的內容瞬女。
如果您有任何問題或意見窍帝,請在我的簡書留言!
附:在這方面沒有什么特別好的教程诽偷,如果你知道有更多更好的坤学,請在留言給我一個教程的鏈接,感謝渤刃!

同步更新于我的個人微信公眾號:

快來關注我呀
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末玛臂,一起剝皮案震驚了整個濱河市笔呀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌官觅,老刑警劉巖刑峡,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洋闽,死亡現(xiàn)場離奇詭異玄柠,居然都是意外死亡,警方通過查閱死者的電腦和手機诫舅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門羽利,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刊懈,你說我怎么就攤上這事这弧。” “怎么了虚汛?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵匾浪,是天一觀的道長。 經常有香客問我卷哩,道長蛋辈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任将谊,我火速辦了婚禮冷溶,結果婚禮上,老公的妹妹穿的比我還像新娘尊浓。我一直安慰自己逞频,他們只是感情好,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布眠砾。 她就那樣靜靜地躺著虏劲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褒颈。 梳的紋絲不亂的頭發(fā)上柒巫,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機與錄音谷丸,去河邊找鬼堡掏。 笑死,一個胖子當著我的面吹牛刨疼,可吹牛的內容都是我干的泉唁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揩慕,長吁一口氣:“原來是場噩夢啊……” “哼亭畜!你這毒婦竟也來了?” 一聲冷哼從身側響起迎卤,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤拴鸵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體劲藐,經...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡八堡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了聘芜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兄渺。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汰现,靈堂內的尸體忽然破棺而出挂谍,到底是詐尸還是另有隱情,我是刑警寧澤服鹅,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布凳兵,位于F島的核電站,受9級特大地震影響企软,放射性物質發(fā)生泄漏庐扫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一仗哨、第九天 我趴在偏房一處隱蔽的房頂上張望形庭。 院中可真熱鬧,春花似錦厌漂、人聲如沸萨醒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽富纸。三九已至,卻和暖如春旨椒,著一層夾襖步出監(jiān)牢的瞬間晓褪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工综慎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涣仿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓示惊,卻偏偏與公主長得像好港,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子米罚,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內容