<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          只需8招,搞定Pandas數(shù)據(jù)篩選與查詢

          共 16711字,需瀏覽 34分鐘

           ·

          2021-10-18 23:24

          今天聊聊Pandas數(shù)據(jù)篩選與查詢的一些操作,在數(shù)據(jù)分析的過程中通常要對數(shù)據(jù)進行清洗與處理,而其中比較重要和常見的操作就有對數(shù)據(jù)進行篩選與查詢。

          目錄:

          • 1. 案例數(shù)據(jù)預(yù)覽

          • 2. 基礎(chǔ)操作

            • 2.1. 切片[]

            • 2.2. 索引選擇.iloc與.loc

            • 2.3. 元素選擇.iat與.at

            • 2.4. ?get與truncate

          • 3. 進階操作

            • 3.1. 邏輯篩選

            • 3.2. 函數(shù)篩選

            • 3.3. query

            • 3.4. filter


          1. 案例數(shù)據(jù)預(yù)覽

          本次案例,我們繼續(xù)采用之前用到過的各地區(qū)GDP數(shù)據(jù),數(shù)據(jù)信息大致如下,后臺回復(fù)GDP可以獲取哈。

          In?[1]:?import?pandas?as?pd

          In?[2]:?df?=?pd.read_excel(r'各地區(qū)生產(chǎn)總值.xlsx')

          In?[3]:?df.head()
          Out[3]:?
          ???????地區(qū)????2020年????2019年????2018年????2017年????2016
          0?????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          1?????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          2?????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          3?????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
          4??內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3

          In?[4]:?df.info()
          <class?'pandas.core.frame.DataFrame'>
          RangeIndex:
          ?32?entries,?0?to?31
          Data?columns?(total?6?columns):
          ?#???Column??Non-Null?Count??Dtype??
          ---??------??--------------??-----??
          ?0???地區(qū)??????32?non-null?????object?
          ?1???2020年???31?non-null?????float64
          ?2???2019年???31?non-null?????float64
          ?3???2018年???31?non-null?????float64
          ?4???2017年???31?non-null?????float64
          ?5???2016年???31?non-null?????float64
          dtypes:?float64(5),?object(1)
          memory?usage:?1.6+?KB

          我們看看描述統(tǒng)計情況,然后在后續(xù)做篩選查詢的時候好演示

          In?[5]:?df.describe()
          Out[5]:?
          ???????????????2020年??????????2019年?????????2018年?????????2017年?????????2016
          count??????31.000000??????31.000000?????31.000000?????31.000000?????31.000000
          mean????32658.551613???31687.758065??29487.661290??26841.819355??24224.148387
          std?????26661.811640???25848.652250??24136.181387??22161.575235??20008.278500
          min??????1902.700000????1697.800000???1548.400000???1349.000000???1173.000000
          25%?????13940.650000???13826.300000??13104.700000??12381.800000??11634.800000
          50%?????25115.000000???24667.300000??22716.500000??20210.800000??18388.600000
          75%?????42612.500000???41110.350000??37508.750000??33835.250000??30370.250000
          max????110760.900000??107986.900000??99945.200000??91648.700000??82163.200000

          可以看到,有效數(shù)據(jù)有30多條,為了讓數(shù)據(jù)顯示好一點,我們可以設(shè)置最多顯示6行

          In?[6]:?pd.set_option('display.max_rows',?6)?#最多顯示6行

          In?[7]:?df
          Out[7]:?
          ??????????地區(qū)????2020年????2019年????2018年????2017年????2016
          0????????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          ..???????...??????...??????...??????...??????...??????...
          29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
          30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
          31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN

          [32?rows?x?6?columns]

          接下來,我們開始演示數(shù)據(jù)的篩選與查詢吧


          2. 基礎(chǔ)操作

          一般來說,數(shù)據(jù)篩選有選擇行、列或者指定位置的值等

          2.1. 切片[]

          切片這玩意就和python的列表數(shù)據(jù)的切片操作很相似

          選擇某一列

          注意:如果列名為 2020年或者2020 年,則無法采用屬性形式,因為這種操作的變量名不能以數(shù)字開頭或存在空格

          df['地區(qū)']??#?切片形式
          Out[8]:?
          0??????????北京市
          1??????????天津市
          2??????????河北省
          ??
          29?????寧夏回族自治區(qū)
          30????新疆維吾爾自治區(qū)
          31?????????臺灣省
          Name:?地區(qū),?Length:?32,?dtype:?object

          In?[9]:?df.地區(qū)??#?屬性形式
          Out[9]:?
          0??????????北京市
          1??????????天津市
          2??????????河北省
          ????????...???
          29?????寧夏回族自治區(qū)
          30????新疆維吾爾自治區(qū)
          31?????????臺灣省
          Name:?地區(qū),?Length:?32,?dtype:?object

          In?[10]:?#?如果列名為?2020年或者2020?年,則無法采用屬性形式,因為這種操作的變量名不能以數(shù)字開頭或存在空格
          ????...:?df.2020
          ??File?"C:\Users\Gdc\AppData\Local\Temp/ipykernel_6832/3948025585.py",?line?2
          ????df.2020
          ??????^
          SyntaxError:?invalid?syntax

          切片操作

          • 切片里是索引位置,篩選的是對應(yīng)的行
          • 同樣如果我們在切片里是列名組成的列表,則可以篩選出這些列
          • 對于只有一列的情況,切片[]是列名構(gòu)成的列表返回結(jié)果類型分別是DataFrame,反之則是Series
          In?[11]:?df[:2]?#?前兩行數(shù)據(jù)
          Out[11]:?
          ????地區(qū)????2020年????2019年????2018年????2017年????2016
          0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          1??天津市??14083.7??14055.5??13362.9??12450.6??11477.2

          In?[12]:?df[6:8]?#?索引6-7?行數(shù)據(jù)(注意這里索引是從0開始的)
          Out[12]:?
          ?????地區(qū)????2020年????2019年????2018年????2017年????2016
          6???吉林省??12311.3??11726.8??11253.8??10922.0??10427.0
          7??黑龍江省??13698.5??13544.4??12846.5??12313.0??11895.0

          In?[13]:?df[:16:2]?#?前15行?隔2行取
          Out[13]:?
          ????????地區(qū)????2020年????2019年????2018年????2017年????2016
          0??????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          2??????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          4???內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3
          ..?????...??????...??????...??????...??????...??????...
          10?????浙江省??64613.3??62462.0??58002.8??52403.1??47254.0
          12?????福建省??43903.9??42326.6??38687.8??33842.4??29609.4
          14?????山東省??73129.0??70540.5??66648.9??63012.1??58762.5

          [8?rows?x?6?columns]

          In?[14]:?df[::-1]?#?倒序
          Out[14]:?
          ??????????地區(qū)????2020年????2019年????2018年????2017年????2016
          31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN
          30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
          29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
          ..???????...??????...??????...??????...??????...??????...
          2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          0????????北京市??36102.6??35445.1??33106.0??29883.0??27041.2

          [32?rows?x?6?columns]

          In?[15]:?#?我們看到剛才在上述切片里是索引位置,篩選的是對應(yīng)的行;同樣如果我們在切片里是列名組成的列表,則可以篩選出這些列
          ????...:?df[['地區(qū)','2016年']]
          Out[15]:?
          ??????????地區(qū)????2016
          0????????北京市??27041.2
          1????????天津市??11477.2
          2????????河北省??28474.1
          ..???????...??????...
          29???寧夏回族自治區(qū)???2781.4
          30??新疆維吾爾自治區(qū)???9630.8
          31???????臺灣省??????NaN

          [32?rows?x?2?columns]

          In?[16]:?#?對于只有一列的情況,以下兩種形式下返回結(jié)果類型分別是DataFrame和Series
          ????...:?df[['地區(qū)']]
          Out[16]:?
          ??????????地區(qū)
          0????????北京市
          1????????天津市
          2????????河北省
          ..???????...
          29???寧夏回族自治區(qū)
          30??新疆維吾爾自治區(qū)
          31???????臺灣省

          [32?rows?x?1?columns]

          In?[17]:?df['地區(qū)']
          Out[17]:?
          0??????????北京市
          1??????????天津市
          2??????????河北省
          ????????...???
          29?????寧夏回族自治區(qū)
          30????新疆維吾爾自治區(qū)
          31?????????臺灣省
          Name:?地區(qū),?Length:?32,?dtype:?object

          2.2. 索引選擇.iloc與.loc

          按照索引有兩種篩選方式,ilocloc

          • df.iloc[行表達式, 列表達式],兩個表達式只支持數(shù)字切片形式:行表達式篩選行、列表達式篩選列
          • df.loc[行表達式, 列表達式],兩個表達式其實是對行列索引名稱的選擇:行表達式篩選行、列表達式篩選列

          當然,這兩種篩選方式的表達式也支持條件

          iloc[]

          大家可以根據(jù)方法名稱來區(qū)分是針對自然索引位置 還是 索引名稱,比如iloc多個i嘛,i就是數(shù)字碼,所以它針對的是自然索引位置

          In?[18]:?df.iloc[0]?#?返回是Series,0是自然索引位置
          Out[18]:?
          地區(qū)???????????北京市
          2020年????36102.6
          2019年????35445.1
          2018年????33106.0
          2017年????29883.0
          2016年????27041.2
          Name:?0,?dtype:?object

          In?[19]:?df.iloc[[0]]?#?返回是一行,0是自然索引位置
          Out[19]:?
          ????地區(qū)????2020年????2019年????2018年????2017年????2016
          0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2

          In?[20]:?df.iloc[:2]?#?前兩行數(shù)據(jù)
          Out[20]:?
          ????地區(qū)????2020年????2019年????2018年????2017年????2016
          0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          1??天津市??14083.7??14055.5??13362.9??12450.6??11477.2

          In?[21]:?df.iloc[:2,[0,1,3]]?#?前兩行,第0-1-3列數(shù)據(jù)
          Out[21]:?
          ????地區(qū)????2020年????2018
          0??北京市??36102.6??33106.0
          1??天津市??14083.7??13362.9

          In?[22]:?df.iloc[1,1]?#?自然索引為1,第1列的數(shù)據(jù)(也就是天津2020年的gdp),一般用?.iat
          Out[22]:?14083.7

          loc[]

          區(qū)別于iloc,它根據(jù)索引的名稱來進行篩選,如果沒有設(shè)置索引一般就是自然索引

          In?[23]:?df1?=?df.set_index('地區(qū)')?#?我們設(shè)置?地區(qū)字段?列?為索引

          In?[24]:?df1
          Out[24]:?
          ????????????2020年????2019年????2018年????2017年????2016
          地區(qū)???????????????????????????????????????????????????
          北京市???????36102.6??35445.1??33106.0??29883.0??27041.2
          天津市???????14083.7??14055.5??13362.9??12450.6??11477.2
          河北省???????36206.9??34978.6??32494.6??30640.8??28474.1
          ...???????????...??????...??????...??????...??????...
          寧夏回族自治區(qū)????3920.5???3748.5???3510.2???3200.3???2781.4
          新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
          臺灣省???????????NaN??????NaN??????NaN??????NaN??????NaN

          [32?rows?x?5?columns]

          In?[25]:?df1.loc['北京市']?#?選擇?索引名為北京市的數(shù)據(jù)
          Out[25]:?
          2020年????36102.6
          2019年????35445.1
          2018年????33106.0
          2017年????29883.0
          2016年????27041.2
          Name:?北京市,?dtype:?float64

          In?[26]:?df1.loc['北京市':'河北省','2020年']?#?選擇?索引名稱?在北京市到河北省,列名為?2020年的數(shù)據(jù)
          Out[26]:?
          地區(qū)
          北京市????36102.6
          天津市????14083.7
          河北省????36206.9
          Name:?2020年,?dtype:?float64

          In?[27]:?df1.loc['北京市':'河北省','2019年':]?#?選擇?索引名稱?在北京市到河北省,列名在?2019年及之后的數(shù)據(jù)
          Out[27]:?
          ???????2019年????2018年????2017年????2016
          地區(qū)?????????????????????????????????????
          北京市??35445.1??33106.0??29883.0??27041.2
          天津市??14055.5??13362.9??12450.6??11477.2
          河北省??34978.6??32494.6??30640.8??28474.1

          In?[28]:?df1.loc[['北京市','上海市','重慶市','天津市'],['2020年','2019年']]?#?選擇索引名為?北京、上海、重慶、天津?2020年及2019年數(shù)據(jù)
          Out[28]:?
          ???????2020年????2019
          地區(qū)???????????????????
          北京市??36102.6??35445.1
          上海市??38700.6??37987.6
          重慶市??25002.8??23605.8
          天津市??14083.7??14055.5

          In?[29]:?df1.loc['北京市','2020年']?#?選擇?索引名為?北京市,列名為2020年?額數(shù)據(jù)(就是坐標元素值)
          Out[29]:?36102.6

          2.3. 元素選擇.iat與.at

          按坐標其實可以通過上述的按索引進行,這里還可以用.iat.at來實現(xiàn),和按索引類型一個是自然索引值一個是索引名稱

          In?[30]:?df.iat[0,2]
          Out[30]:?35445.1

          In?[31]:?df1.at['北京市','2019年']
          Out[31]:?35445.1

          In?[32]:?df.地區(qū).at[3]
          Out[32]:?'山西省'

          In?[33]:?#?其實還有以下方式
          ????...:?df1['2019年']['北京市']
          Out[33]:?35445.1

          In?[34]:?df['2019年'][0]
          Out[34]:?35445.1

          2.4. ?get與truncate

          df.get(key, default=None)類似python字典里的get方法

          df.truncate(before=None, after=None, axis=None, copy: 'bool_t' = True),返回區(qū)間數(shù)據(jù)

          get()

          對于DataFrame數(shù)據(jù)來說返回key列的值,如果key不存在就返回默認值。

          Signature:?df.get(key,?default=None)
          Docstring:
          Get?item?from?object?for?given?key?(ex:?DataFrame?column).

          Returns?default?value?if?not?found.

          對于Series數(shù)據(jù)來說,返回key索引的值,不存在就返回默認值。

          In?[35]:?df.get('地區(qū)','無數(shù)據(jù)')
          Out[35]:?
          0??????????北京市
          1??????????天津市
          2??????????河北省
          ????????...???
          29?????寧夏回族自治區(qū)
          30????新疆維吾爾自治區(qū)
          31?????????臺灣省
          Name:?地區(qū),?Length:?32,?dtype:?object

          In?[36]:?df.get('2015年','無數(shù)據(jù)')
          Out[36]:?'無數(shù)據(jù)'

          In?[37]:?df.地區(qū).get(0,'無數(shù)據(jù)')
          Out[37]:?'北京市'

          In?[38]:?df.地區(qū).get(100,'無數(shù)據(jù)')
          Out[38]:?'無數(shù)據(jù)'

          truncate()

          將索引代入beforeafter,截取這區(qū)間的數(shù)據(jù),支持對行和列操作

          In?[39]:?df.truncate(before=0,after=4)
          Out[39]:?
          ???????地區(qū)????2020年????2019年????2018年????2017年????2016
          0?????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          1?????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          2?????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          3?????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
          4??內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3

          In?[40]:?df.truncate(before='2018年',after='2020年',axis=1)
          Out[40]:?
          ??????2020年????2019年????2018
          0???36102.6??35445.1??33106.0
          1???14083.7??14055.5??13362.9
          2???36206.9??34978.6??32494.6
          ..??????...??????...??????...
          29???3920.5???3748.5???3510.2
          30??13797.6??13597.1??12809.4
          31??????NaN??????NaN??????NaN

          [32?rows?x?3?columns]

          以上屬于數(shù)據(jù)篩選與查詢的基礎(chǔ)操作,接下來我們介紹進階操作


          3. 進階操作

          基礎(chǔ)操作部分我們介紹的是比較簡單的數(shù)據(jù)篩選操作,實際的數(shù)據(jù)清洗與處理時我們更多的是需要根據(jù)更加復(fù)雜的組合條件來查詢數(shù)據(jù)進行篩選。這一節(jié),我們就來一一介紹一下。

          3.1. 邏輯篩選

          邏輯刷選這里是指按照一定的邏輯條件來進行數(shù)據(jù)的篩選,比如滿足某條件的行、列數(shù)據(jù)等等

          In?[41]:?df[df['地區(qū)']?==?'北京市']?#?地區(qū)是北京市的數(shù)據(jù)
          Out[41]:?
          ????地區(qū)????2020年????2019年????2018年????2017年????2016
          0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2

          In?[42]:?df[df['地區(qū)'].str.contains('市')]?#?地區(qū)名稱?含關(guān)鍵字?市?的數(shù)據(jù)?
          Out[42]:?
          ?????地區(qū)????2020年????2019年????2018年????2017年????2016
          0???北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          1???天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          8???上海市??38700.6??37987.6??36011.8??32925.0??29887.0
          21??重慶市??25002.8??23605.8??21588.8??20066.3??18023.0

          In?[43]:?df[df['地區(qū)'].str.contains('市|自治區(qū)')]?#?地區(qū)名稱含關(guān)鍵字?市或自治區(qū)?的數(shù)據(jù)
          Out[43]:?
          ??????????地區(qū)????2020年????2019年????2018年????2017年????2016
          0????????北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          4?????內(nèi)蒙古自治區(qū)??17359.8??17212.5??16140.8??14898.1??13789.3
          ..???????...??????...??????...??????...??????...??????...
          25?????西藏自治區(qū)???1902.7???1697.8???1548.4???1349.0???1173.0
          29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
          30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8

          [9?rows?x?6?columns]

          In?[44]:?df[df['地區(qū)'].isin(['北京市','湖北省','江蘇省'])]?#?地區(qū)名稱?在北京市、湖北省、江蘇省的數(shù)據(jù)
          Out[44]:?
          ?????地區(qū)?????2020年????2019年????2018年????2017年????2016
          0???北京市???36102.6??35445.1??33106.0??29883.0??27041.2
          9???江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9
          16??湖北省???43443.5??45429.0??42022.0??37235.0??33353.0

          In?[45]:?df[~df['地區(qū)'].isin(['北京市','湖北省','江蘇省'])]?#?地區(qū)名稱?不在北京市、湖北省、江蘇省的數(shù)據(jù)
          Out[45]:?
          ??????????地區(qū)????2020年????2019年????2018年????2017年????2016
          1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          3????????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
          ..???????...??????...??????...??????...??????...??????...
          29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
          30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
          31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN

          [29?rows?x?6?columns]

          除了上面用切片[]的形式,同樣可以用loc[]的形式

          In?[46]:?df.loc[df['地區(qū)'].isin(['北京市','湖北省','江蘇省'])]
          Out[46]:?
          ?????地區(qū)?????2020年????2019年????2018年????2017年????2016
          0???北京市???36102.6??35445.1??33106.0??29883.0??27041.2
          9???江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9
          16??湖北省???43443.5??45429.0??42022.0??37235.0??33353.0

          對于iloc[]來說,則需要是對自然索引值的判斷

          In?[47]:?df.iloc[df.index==9]
          Out[47]:?
          ????地區(qū)?????2020年????2019年????2018年????2017年????2016
          9??江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9

          我們還可以進行更復(fù)雜的邏輯判斷去篩選想要的數(shù)據(jù),在進行 或(|) 且(&) 非(~) 邏輯判斷的時候,每個獨立的邏輯判斷需要用括號括起來

          In?[48]:?df[df['2020年']'2019年']]?#?2020年GDP小于2019年GDP的省份
          Out[48]:?
          ?????地區(qū)????2020年????2019年????2018年????2017年????2016
          16??湖北省??43443.5??45429.0??42022.0??37235.0??33353.0

          In?[49]:?df[(df['2020年']>30000)?&
          ????...:????(df['2019年']>30000)
          ????...:???]?#?最近連續(xù)2年GDP超過3萬億的地區(qū)
          Out[49]:?
          ?????地區(qū)?????2020年?????2019年????2018年????2017年????2016
          0???北京市???36102.6???35445.1??33106.0??29883.0??27041.2
          2???河北省???36206.9???34978.6??32494.6??30640.8??28474.1
          8???上海市???38700.6???37987.6??36011.8??32925.0??29887.0
          ..??...???????...???????...??????...??????...??????...
          17??湖南省???41781.5???39894.1??36329.7??33828.1??30853.5
          18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
          22??四川省???48598.8???46363.8??42902.1??37905.1??33138.5

          [13?rows?x?6?columns]

          我們還可以通過anyall對邏輯判斷后結(jié)果進行再次判斷,對于all來說需要都滿足才行,對于any來說只需要滿足一個即可,需要注意的是默認是0列方向,1是行方向

          In?[50]:?df[(df[['2020年','2019年']]>30000).all(1)]?#?最近連續(xù)2年GDP超過3萬億的地區(qū)
          Out[50]:?
          ?????地區(qū)?????2020年?????2019年????2018年????2017年????2016
          0???北京市???36102.6???35445.1??33106.0??29883.0??27041.2
          2???河北省???36206.9???34978.6??32494.6??30640.8??28474.1
          8???上海市???38700.6???37987.6??36011.8??32925.0??29887.0
          ..??...???????...???????...??????...??????...??????...
          17??湖南省???41781.5???39894.1??36329.7??33828.1??30853.5
          18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
          22??四川省???48598.8???46363.8??42902.1??37905.1??33138.5

          [13?rows?x?6?columns]

          In?[51]:?df[(df[['2020年','2019年']]>100000).all(1)]?#?最近2年有1年GDP超過10萬億
          Out[51]:?
          ?????地區(qū)?????2020年?????2019年????2018年????2017年????2016
          18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2

          3.2. 函數(shù)篩選

          函數(shù)篩選是指 我們在不管是切片還是索引選擇方式中,表達式還可以是lambda函數(shù);此外,pandas也提供了一些比較函數(shù)可以用來進行數(shù)據(jù)篩選。

          自定義lambda函數(shù)

          df.loc[lambda?x?:?x['2020年']>50000,?['地區(qū)','2020年','2019年']]?#?篩選2020年GDP超過5萬億且只選?地區(qū)、2020年和2019年數(shù)據(jù)
          Out[53]:?
          ?????地區(qū)?????2020年?????2019
          9???江蘇省??102719.0???98656.8
          10??浙江省???64613.3???62462.0
          14??山東省???73129.0???70540.5
          15??河南省???54997.1???53717.8
          18??廣東省??110760.9??107986.9

          In?[54]:?import?re
          ????
          In?[55]:?df.loc[:,?lambda?x?:?[i?for?i?in?df.columns[1:]?if?int(re.findall('\d+',i)[0])<2020]]?#?篩選列名滿足條件的列
          Out[55]:?
          ??????2019年????2018年????2017年????2016
          0???35445.1??33106.0??29883.0??27041.2
          1???14055.5??13362.9??12450.6??11477.2
          2???34978.6??32494.6??30640.8??28474.1
          ..??????...??????...??????...??????...
          29???3748.5???3510.2???3200.3???2781.4
          30??13597.1??12809.4??11159.9???9630.8
          31??????NaN??????NaN??????NaN??????NaN

          [32?rows?x?4?columns]

          比較函數(shù)

          panda有一些比較函數(shù),我們可以將邏輯表達式替換為比較函數(shù)形式

          In?[56]:?df[df['地區(qū)'].eq('北京市')]?#?等于
          Out[56]:?
          ????地區(qū)????2020年????2019年????2018年????2017年????2016
          0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2

          In?[57]:?df[df['地區(qū)'].ne('北京市')]?#?不等于
          Out[57]:?
          ??????????地區(qū)????2020年????2019年????2018年????2017年????2016
          1????????天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          2????????河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          3????????山西省??17651.9??16961.6??15958.1??14484.3??11946.4
          ..???????...??????...??????...??????...??????...??????...
          29???寧夏回族自治區(qū)???3920.5???3748.5???3510.2???3200.3???2781.4
          30??新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8
          31???????臺灣省??????NaN??????NaN??????NaN??????NaN??????NaN

          [31?rows?x?6?columns]

          In?[58]:?df[df['2020年'].lt(10000)]?#?小于
          Out[58]:?
          ?????????地區(qū)???2020年???2019年???2018年???2017年???2016
          20??????海南省??5532.4??5330.8??4910.7??4497.5??4090.2
          25????西藏自治區(qū)??1902.7??1697.8??1548.4??1349.0??1173.0
          27??????甘肅省??9016.7??8718.3??8104.1??7336.7??6907.9
          28??????青海省??3005.9??2941.1??2748.0??2465.1??2258.2
          29??寧夏回族自治區(qū)??3920.5??3748.5??3510.2??3200.3??2781.4

          In?[59]:?df[df['2020年'].le(5532.4)]?#?小于等于
          Out[59]:?
          ?????????地區(qū)???2020年???2019年???2018年???2017年???2016
          20??????海南省??5532.4??5330.8??4910.7??4497.5??4090.2
          25????西藏自治區(qū)??1902.7??1697.8??1548.4??1349.0??1173.0
          28??????青海省??3005.9??2941.1??2748.0??2465.1??2258.2
          29??寧夏回族自治區(qū)??3920.5??3748.5??3510.2??3200.3??2781.4

          In?[60]:?df[df['2020年'].gt(50000)]?#?大于
          Out[60]:?
          ?????地區(qū)?????2020年?????2019年????2018年????2017年????2016
          9???江蘇省??102719.0???98656.8??93207.6??85869.8??77350.9
          10??浙江省???64613.3???62462.0??58002.8??52403.1??47254.0
          14??山東省???73129.0???70540.5??66648.9??63012.1??58762.5
          15??河南省???54997.1???53717.8??49935.9??44824.9??40249.3
          18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2

          In?[61]:?df[df['2020年'].ge(62462.0)]?#?大于等于
          Out[61]:?
          ?????地區(qū)?????2020年?????2019年????2018年????2017年????2016
          9???江蘇省??102719.0???98656.8??93207.6??85869.8??77350.9
          10??浙江省???64613.3???62462.0??58002.8??52403.1??47254.0
          14??山東省???73129.0???70540.5??66648.9??63012.1??58762.5
          18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2

          對于isin(),還可以傳入字典,key為列名,value為待匹配的值(這個大家可以構(gòu)建數(shù)據(jù)試試)

          3.3. query

          Signature:?df.query(expr:?'str',?inplace:?'bool'?=?False,?**kwargs)
          Docstring:
          Query?the?columns?of?a?DataFrame?with?a?boolean?expression.

          query()的很高校的查詢方法,其表達式是一個字符串,我們在《再推薦幾個好用的pandas函數(shù),繼續(xù)加快你數(shù)據(jù)處理的速度》介紹過,大家可前往了解,這里稍微介紹下

          • 在引號中,如果列名是數(shù)字開頭或者含有空格,則需要用`反引號標識
          • 其他情況下的列名直接寫即可,用于篩選對比的對象如果是字符串則需要用引號
          • 我們還可以通過@來引入變量
          In?[62]:?df.query('地區(qū)=="北京市"')?#?地區(qū)為北京市的數(shù)據(jù)
          Out[62]:?
          ????地區(qū)????2020年????2019年????2018年????2017年????2016
          0??北京市??36102.6??35445.1??33106.0??29883.0??27041.2

          In?[63]:?df.query('`2020年`<`2019年`')?#?2020年GDP小于2019年GDP的數(shù)據(jù)
          Out[63]:?
          ?????地區(qū)????2020年????2019年????2018年????2017年????2016
          16??湖北省??43443.5??45429.0??42022.0??37235.0??33353.0

          In?[64]:?mean_gdp?=?df['2020年'].mean()
          ????????
          In?[64]:?mean_gdp
          Out[65]:?32658.55161290323

          In?[66]:?df.query('`2020年`?>?@mean_gdp')?#?@?引入變量
          Out[66]:?
          ?????地區(qū)?????2020年?????2019年????2018年????2017年????2016
          0???北京市???36102.6???35445.1??33106.0??29883.0??27041.2
          2???河北省???36206.9???34978.6??32494.6??30640.8??28474.1
          8???上海市???38700.6???37987.6??36011.8??32925.0??29887.0
          ..??...???????...???????...??????...??????...??????...
          17??湖南省???41781.5???39894.1??36329.7??33828.1??30853.5
          18??廣東省??110760.9??107986.9??99945.2??91648.7??82163.2
          22??四川省???48598.8???46363.8??42902.1??37905.1??33138.5

          [13?rows?x?6?columns]

          3.4. filter

          Signature:
          df.filter(
          ????items=None,
          ????like:?'str?|?None'?=?None,
          ????regex:?'str?|?None'?=?None,
          ????axis=None,
          )?->?'FrameOrSeries'
          Docstring:
          Subset?the?dataframe?rows?or?columns?according?to?the?specified?index?labels.

          Note?that?this?routine?does?not?filter?a?dataframe?on?its
          contents.?The?filter?is?applied?to?the?labels?of?the?index.

          df.filter()可以對行和列名進行篩選,支持模糊匹配和正則表達式

          In?[67]:?df.filter(items=['2020年','2016年'])?#?選擇兩列
          Out[67]:?
          ??????2020年????2016
          0???36102.6??27041.2
          1???14083.7??11477.2
          2???36206.9??28474.1
          ..??????...??????...
          29???3920.5???2781.4
          30??13797.6???9630.8
          31??????NaN??????NaN

          [32?rows?x?2?columns]

          In?[68]:?df.filter(regex='年')?#?列名稱含?年?的列
          Out[68]:?
          ??????2020年????2019年????2018年????2017年????2016
          0???36102.6??35445.1??33106.0??29883.0??27041.2
          1???14083.7??14055.5??13362.9??12450.6??11477.2
          2???36206.9??34978.6??32494.6??30640.8??28474.1
          ..??????...??????...??????...??????...??????...
          29???3920.5???3748.5???3510.2???3200.3???2781.4
          30??13797.6??13597.1??12809.4??11159.9???9630.8
          31??????NaN??????NaN??????NaN??????NaN??????NaN

          [32?rows?x?5?columns]

          In?[69]:?df1.filter(regex='市',?axis=0)?#?索引名含?市?的數(shù)據(jù)
          Out[69]:?
          ???????2020年????2019年????2018年????2017年????2016
          地區(qū)??????????????????????????????????????????????
          北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          天津市??14083.7??14055.5??13362.9??12450.6??11477.2
          上海市??38700.6??37987.6??36011.8??32925.0??29887.0
          重慶市??25002.8??23605.8??21588.8??20066.3??18023.0

          In?[70]:?df1.filter(regex='^江',?axis=0)?#?索引名中以江開頭的
          Out[70]:?
          ????????2020年????2019年????2018年????2017年????2016
          地區(qū)???????????????????????????????????????????????
          江蘇省??102719.0??98656.8??93207.6??85869.8??77350.9
          江西省???25691.5??24667.3??22716.5??20210.8??18388.6

          In?[71]:?df1.filter(regex='自治區(qū)$',?axis=0)?#?索引名中以自治區(qū)結(jié)尾的
          Out[71]:?
          ????????????2020年????2019年????2018年????2017年????2016
          地區(qū)???????????????????????????????????????????????????
          內(nèi)蒙古自治區(qū)????17359.8??17212.5??16140.8??14898.1??13789.3
          廣西壯族自治區(qū)???22156.7??21237.1??19627.8??17790.7??16116.6
          西藏自治區(qū)??????1902.7???1697.8???1548.4???1349.0???1173.0
          寧夏回族自治區(qū)????3920.5???3748.5???3510.2???3200.3???2781.4
          新疆維吾爾自治區(qū)??13797.6??13597.1??12809.4??11159.9???9630.8

          In?[72]:?df1.filter(like='北',axis=0)?#?索引名中有?北?的
          Out[72]:?
          ???????2020年????2019年????2018年????2017年????2016
          地區(qū)??????????????????????????????????????????????
          北京市??36102.6??35445.1??33106.0??29883.0??27041.2
          河北省??36206.9??34978.6??32494.6??30640.8??28474.1
          湖北省??43443.5??45429.0??42022.0??37235.0??33353.0

          以上就是本次全部內(nèi)容,希望對你有所幫助,如果你喜歡的話還希望能給個三連呀歡迎在留言區(qū)吱一聲哦,說說你的想法哦。我們月底會給經(jīng)常來留言打卡的同學(xué)送書10本,記得常來指導(dǎo)工作哦!




          推薦閱讀:

          入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個月的Python??|?實戰(zhàn)項目?|學(xué)Python就是這條捷徑


          量化:?定投基金到底能賺多少錢?? |?我用Python對去年800只基金的數(shù)據(jù)分析??


          干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個海量小姐姐素描圖?|碟中諜這么火,我用機器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


          趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!


          AI:?會做詩的機器人?|?給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


          小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費!?|?用90行代碼打造最強PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r機票提示器!?|60行代碼做了一個語音壁紙切換器天天看小姐姐!

          瀏覽 29
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  а天堂中文在线官网 | 久久精品蜜桃 | 淫荡骚逼| 免费在线a视频 | 91嫩草欧美久久久九九九 |