Pandas從入門到精通(3)- Pandas索引

首先我們要明確索引的作用汁展。在SQL中我們通過索引能夠快速的定位數(shù)據(jù)貌夕,就像一本書的目錄一樣,通過目錄我們可以快速的定位到書中的某個章節(jié)踊挠。在pandas里面,我們通過索引進行數(shù)據(jù)的選取和篩選冲杀。就像在一張大表里面選取我們需要分析或者感興趣的內(nèi)容效床,此時就需要用到索引的相關(guān)操作。這個是pandas中基本操作权谁,需要熟練掌握剩檀。因為一維的Series比較簡單,我們以二維的數(shù)據(jù)結(jié)構(gòu)DataFrame為例進行總結(jié)旺芽。主要包括以下內(nèi)容:

  1. 列選取沪猴,選取一列或者多列
  2. 行選取
  3. loc和iloc選取(主要內(nèi)容采章,經(jīng)常用)
  4. Query方法選取

下面通過代碼實戰(zhàn)進行演練运嗜。下面代碼中涉及的數(shù)據(jù)集和代碼可以在后臺回復(fù)“pandas”獲取

import numpy as np
import pandas as pd

df = pd.read_csv('learn_pandas.csv')
df.head()
image.png

這是一個包含學(xué)生姓名/性別和學(xué)校以及身高體重等信息的表格

1.列選饶稹:根據(jù)要求選擇一列或者多列

對于DataFrame的列叠纷,可以使用“[]”操作符或者"."進行選擇,使用“.”時要注意鲫构,列明不能有空格如下:

# 通過列標(biāo)簽選擇數(shù)據(jù)
df['School'].head()
>>>
0    Shanghai Jiao Tong University
1                Peking University
2    Shanghai Jiao Tong University
3                 Fudan University
4                 Fudan University
Name: School, dtype: object

要同時選取多列時抵怎,一般是先創(chuàng)建一個列表奋救,將所需要的內(nèi)容放入列表中,再將該列表整體傳入df中:

use_col = ['Name', 'Gender', 'Height', 'Test_Date']
df[use_col].head(5)

結(jié)果如下:

image.png

2. 行選取

當(dāng)要求按照某個字段的條件篩選某些行時反惕,可以直接將該條件作為一個condition傳入df中尝艘,舉例:

  1. 篩選 Peking University的學(xué)生:
# 直接按照條件帶入帶入:
df[df['School'] == 'Peking University'].head()
# 上面的寫法等價于:
condition = (df['School'] == 'Peking University')
df[condition].head
>>>

結(jié)果如下:


image.png
  1. 篩選身高大于165的同學(xué):
df[df['Height'] > 165].head()
image.png

3. loc和iloc

在實際實戰(zhàn)中,按照一定條件選擇數(shù)據(jù)更常用的方法是loc和iloc, 兩者的語法結(jié)構(gòu)類似姿染,不同之處在于:

  • loc : 基于label索引器背亥,列名和行號都可以作為label
  • iloc: 基于index索引的索引器
    這兩個容易混淆,實際中可以按照首字母記憶盔粹,即loc和label都是“l(fā)”開頭隘梨,iloc和index都是“i”開頭。
    語法結(jié)構(gòu)以loc為例舷嗡,iloc一樣:
    df. loc[*, *] 轴猎,其中第一個 * 代表行的選擇,第二個 * 代表列的選擇进萄,如果省略第二個位置寫作 loc[] 捻脖,這個 * 是指行的篩選锐峭。
    其中, * 的位置一共有五類合法對象可婶,分別是:單個元素沿癞、元素列表、元素切片矛渴、布爾列表以及函數(shù)椎扬,常用的為前面4個,下面將依次說明具温。
    我們以loc為例蚕涤,前面說了,loc是基于label選取的铣猩,我們把行索引index設(shè)置為Name,這樣更容易說明揖铜。
df_new = df.set_index('Name')
df_new.head()
image.png

【a】 * 為單個元素

此時,直接取出相應(yīng)的行或列达皿,如果該元素在索引中重復(fù)則結(jié)果為 DataFrame天吓,否則為 Series

df_new.loc['Gaojuan You'] #   原表格中只有一行滿足條件,返回一個Series
>>>
School         Fudan University
Grade                 Sophomore
Gender                     Male
Height                    174.0
Weight                     74.0
Transfer                      N
Test_Number                   2
Test_Date             2019/11/6
Time_Record             0:05:22
Name: Gaojuan You, dtype: object
df_new.loc['Qiang Sun']  # 原表格中有多行滿足條件,返回一個DataFrame 
image.png

【b】 * 為元素列表

此時,取出列表中所有元素值對應(yīng)的行或列:

df_new.loc[['Qiang Sun', 'Xiaojuan Sun'],['School', 'Gender', 'Weight']]
image.png

【c】 * 為切片

之前的 Series 使用字符串索引時提到峦椰,如果是唯一值的起點和終點字符龄寞,那么就可以使用切片,并且包含兩個端點们何,如果不唯一則報錯:

df_new.loc['Changqiang You':'Gaoqiang Qian', 'School':'Test_Number']
image.png

【d】 * 為布爾列表
在前面的行選取中萄焦,其實我們已經(jīng)使用了和loc布爾列表類似的操作了。我們在來看一下上面例子中的表達式: df[df['Height'] > 165]冤竹,在該表達式中:

  • 第一步:內(nèi)部的“df['Height'] > 165” 返回一個與 DataFrame 長度相同的布爾列表
  • 第二步:外面在套上df后,實際上執(zhí)行了一個篩選操作茬射,即且列表為 True 的位置所對應(yīng)的行會被選中鹦蠕, False 則會被剔除。
    df.loc也可以完成相同的功能:
(df.loc[df['School'] == 'Tsinghua University' ]) == (df[df['School'] == 'Tsinghua University'])
image.png

在實際操作中在抛,往往需要根據(jù)多個條件來選取數(shù)據(jù)钟病,對于這種復(fù)合條件而言,可以用 |(或), &(且), ~(取反) 的組合來實現(xiàn)刚梭。
實戰(zhàn)操作: 選取復(fù)旦大學(xué)中體重超過70kg的大四學(xué)生肠阱,或者北大男生中體重超過80kg的非大四的學(xué)生:

condition_1_a = df_new['School'] == 'Fudan University'
condition_1_b = df_new['Grade'] == 'Senior'
condition_1_c = df_new['Weight'] > 70
condition_1 = condition_1_a & condition_1_b & condition_1_c

condition_2_a = df_new.School == 'Peking University'
condition_2_b = df_new.Grade == 'Senior'
condition_2_c = df_new.Weight > 80
condition_2 = condition_2_a & (~condition_2_b) & condition_2_c

res = df_new.loc[condition_1 | condition_2]
res

結(jié)果如下:


image.png

iloc 的使用與 loc 完全類似,只不過是針對index索引進行篩選朴读,因為行/列的索引index均是從0開始的整數(shù)屹徘,因而在相應(yīng)的 * 位置處一共也有五類合法對象,分別是:整數(shù)衅金、整數(shù)列表噪伊、整數(shù)切片簿煌、布爾列表以及函數(shù),函數(shù)的返回值必須是前面的四類合法對象中的一個鉴吹,其輸入同樣也為 DataFrame 本身姨伟。
這個方法有一個常用的場景,就是在機器學(xué)習(xí)的數(shù)據(jù)集劃分中豆励。例如在一個大表中夺荒,前面的列為特征,最后一列為對應(yīng)的標(biāo)簽良蒸,這時需要將除去最后一列的數(shù)據(jù)作為X,最后一列的值作為標(biāo)簽Y般堆,例如在上面的表格中,我們可以:

X = df.iloc[:, :-1] # : 前面為行诚啃,不寫表示選取所有行淮摔,后面為列,-1為最后一列始赎,不包括
Y = df['Time_Record'] 

4. Query方法

在 pandas 中和橙,支持把字符串形式的查詢表達式傳入 query 方法來查詢數(shù)據(jù),其表達式的執(zhí)行結(jié)果必須返回布爾列表造垛。在進行復(fù)雜索引時魔招,由于這種檢索方式無需像普通方法一樣重復(fù)使用 DataFrame 的名字來引用列名,一般而言會使代碼長度在不降低可讀性的前提下有所減少五辽。
例如办斑,可以將上面loc方法的復(fù)合選取改用query方法來做:

# 將 loc 一節(jié)中的復(fù)合條件查詢例子可以如下改寫:
df.query('((School == "Fudan University")&'
          ' (Grade == "Senior")&'
        ' (Weight > 70))|'
         '((School == "Peking University")&'
         ' (Grade != "Senior")&'
         ' (Weight > 80))')
image.png

在 query 表達式中,系統(tǒng)自動幫用戶注冊了所有來自 DataFrame 的列名杆逗,所有屬于該 Series 的方法都可以被調(diào)用乡翅,和正常的函數(shù)調(diào)用并沒有區(qū)別,即在調(diào)用是無需在聲明df['列名‘]的形式罪郊,直接使用列名蠕蚜。例如查詢體重超過均值且性別為女的學(xué)生:

df.query('(Weight > Weight.mean())' and '(Gender == "Female")').head(6)

部分結(jié)果如下:


image.png

參考:開源內(nèi)容Joyful Pandas, 作者 DataWhale耿遠昊
另外,更多精彩內(nèi)容也可以微信搜索悔橄,并關(guān)注公眾號:‘Python數(shù)據(jù)科學(xué)家之路“ 靶累,期待您的到來和我交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市癣疟,隨后出現(xiàn)的幾起案子挣柬,更是在濱河造成了極大的恐慌,老刑警劉巖睛挚,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邪蛔,死亡現(xiàn)場離奇詭異,居然都是意外死亡竞川,警方通過查閱死者的電腦和手機店溢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門叁熔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人床牧,你說我怎么就攤上這事荣回。” “怎么了戈咳?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵心软,是天一觀的道長。 經(jīng)常有香客問我著蛙,道長删铃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任踏堡,我火速辦了婚禮猎唁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顷蟆。我一直安慰自己诫隅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布帐偎。 她就那樣靜靜地躺著逐纬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪削樊。 梳的紋絲不亂的頭發(fā)上豁生,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音漫贞,去河邊找鬼甸箱。 笑死,一個胖子當(dāng)著我的面吹牛绕辖,可吹牛的內(nèi)容都是我干的摇肌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼仪际,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昵骤?” 一聲冷哼從身側(cè)響起树碱,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎变秦,沒想到半個月后成榜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蹦玫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年赎婚,在試婚紗的時候發(fā)現(xiàn)自己被綠了刘绣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡挣输,死狀恐怖纬凤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撩嚼,我是刑警寧澤停士,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站完丽,受9級特大地震影響恋技,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逻族,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一蜻底、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聘鳞,春花似錦薄辅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸡典,卻和暖如春源请,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彻况。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工谁尸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纽甘。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓良蛮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悍赢。 傳聞我的和親對象是個殘疾皇子决瞳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 第1章 入門知識 簡述:用于操作行列數(shù)據(jù),方便地實現(xiàn)各種形式的數(shù)據(jù)分析左权; Pandas最初主要應(yīng)用于金融數(shù)據(jù)分析工...
    惑也閱讀 1,027評論 0 3
  • 資料來源:https://github.com/BrambleXu/pydata-notebook pandas是...
    林清貓耳閱讀 973評論 0 5
  • 目錄 1.創(chuàng)建對象 2.查看數(shù)據(jù) 3.寫入數(shù)據(jù)(read_csv) 4.寫出/導(dǎo)出數(shù)據(jù)(to_csv) 5.讀取行...
    鯨魚醬375閱讀 1,106評論 0 2
  • pandas Pandas是線上服務(wù)類型皮胡,數(shù)據(jù)分析和數(shù)據(jù)處理(在機器學(xué)習(xí)中數(shù)據(jù)處理) 數(shù)據(jù)分析三劍客: numpy...
    Galaxy_saturn閱讀 748評論 0 1
  • 第1章 準(zhǔn)備工作第2章 Python語法基礎(chǔ),IPython和Jupyter第3章 Python的數(shù)據(jù)結(jié)構(gòu)赏迟、函數(shù)和...
    SeanCheney閱讀 162,589評論 76 396