<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>

          6個提升效率的pandas小技巧

          共 2796字,需瀏覽 6分鐘

           ·

          2020-09-18 07:25

          ?

          ?文章來源:towardsdatascience
          ?作者:B.Chen
          ?翻譯\編輯:Python大數(shù)據(jù)分析

          pandas是python中常用的數(shù)據(jù)分析庫,出現(xiàn)頻率非常高,而且pandas功能之多讓人咋舌,即使pandas老手也沒法保證能高效使用pandas做數(shù)據(jù)分析。

          這篇文章目的梳理幾個高效實用的pandas小技巧,供大家參考。

          1. 從剪切板中創(chuàng)建DataFrame

          pandas中的read_clipboard()方法非常神奇,可以把剪切板中的數(shù)據(jù)變成dataframe格式,也就是說直接在excel中復(fù)制表格,可以快速轉(zhuǎn)化為dataframe。

          以下面這個excel數(shù)據(jù)表為例,全部選中,按ctrl+c復(fù)制:

          然后在python中執(zhí)行pd.read_clipboard(),就能得到一模一樣的dataframe數(shù)據(jù)表:

          pd.read_clipboard()

          這功能對經(jīng)常在excel和python中切換的分析師來說簡直是福音,excel中的數(shù)據(jù)能一鍵轉(zhuǎn)化為pandas可讀格式。

          2. ?通過數(shù)據(jù)類型選擇columns

          數(shù)據(jù)分析過程可能會需要篩選數(shù)據(jù)列,比如只需要數(shù)值列,以經(jīng)典的泰坦尼克數(shù)據(jù)集為例:

          import?seaborn?as?sns
          #?導(dǎo)出泰坦尼克數(shù)據(jù)集
          df?=?sns.load_dataset('titanic')
          df.head()

          查看該數(shù)據(jù)集各列的數(shù)據(jù)類型:

          df.dtypes

          可以看到各列的數(shù)據(jù)類型不太一樣,有int、object、float、bool等。

          如果說我只要需要數(shù)值列,也就是數(shù)據(jù)類型為int、float的列,可以通過select_dtypes方法實現(xiàn):

          df.select_dtypes(include='number').head()

          選擇除數(shù)據(jù)類型為int外其他的列,注意這里的參數(shù)是exclude

          df.select_dtypes(exclude='int').head()

          也可以選擇多種數(shù)據(jù)類型:

          df.select_dtypes(include=['int',?'datetime',?'object']).head()

          3. 將strings改為numbers

          在pandas中,有兩種方法可以將字符串改為數(shù)值:

          • astype()方法
          • to_numeric()方法

          先創(chuàng)建一個樣本dataframe,看看這兩種方法有什么不同。

          import?pandas?as?pd
          df?=?pd.DataFrame({?'product':?['A','B','C','D'],?
          ???????????????????'price':?['10','20','30','40'],
          ???????????????????'sales':?['20','-','60','-']
          ??????????????????})
          df

          product列是字符串類型,price、sales列雖然內(nèi)容有數(shù)字,但它們的數(shù)據(jù)類型也是字符串。

          值得注意的是,price列都是數(shù)字,sales列有數(shù)字,但空值用-代替了。

          df.dtypes

          下面我們用astype()方法將price列的數(shù)據(jù)類型改為int:

          df['price']?=?df['price'].astype(int)
          #?或者用另一種方式
          df?=?df.astype({'price':?'int'})

          但如果你同樣用astype()方法更改sales列的話就會出現(xiàn)報錯:

          df['sales']?=?df['sales'].astype(int)

          原因是sales列里面的內(nèi)容除了數(shù)字外還有-,它是字符串,沒辦法轉(zhuǎn)化為int。

          to_numeric()方法卻可以解決這一問題,只需要設(shè)置參數(shù)errors='coerce'。

          df['sales']?=?pd.to_numeric(df['sales'],?errors='coerce')

          df

          現(xiàn)在sale列中的-已經(jīng)被替換成了NaN,它的數(shù)據(jù)類型也變成了float。

          df.dtypes

          4. 檢測并處理缺失值

          有一種比較通用的檢測缺失值的方法是info(),它可以統(tǒng)計每列非缺失值的數(shù)量。

          還是用泰坦尼克數(shù)據(jù)集:

          import?seaborn?as?sns
          #?導(dǎo)出泰坦尼克數(shù)據(jù)集
          df?=?sns.load_dataset('titanic')
          df.info()

          標(biāo)紅色地方是有缺失值的列,并且給出了非缺失值的數(shù)量,你可以計算出該列有多少缺失值。

          這樣看可能不夠直觀,那可以用df.isnull().sum()方法很清楚地得到每列有多少缺失值:

          df.isnull().sum()

          df.isnull().sum().sum()則能夠返回該數(shù)據(jù)集總共有多少缺失值:

          df.isnull().sum().sum()

          還可以看缺失值在該列的占比是多少,用df.isna().mean()方法:

          df.isna().mean()

          注意:這里isnull()isna()使用效果一樣。

          那如何處理缺失值呢?

          兩種方式:刪除和替換。

          • 刪除包含缺失值的行:
          df.dropna(axis?=?0)
          • 刪除包含缺失值的列:
          df.dropna(axis?=?1)
          • 如果一列里缺失值超過10%,則刪除該列:
          df.dropna(thresh=len(df)*0.9,?axis=1)
          • 用一個標(biāo)量替換缺失值:
          df.fillna(value=10)
          • 用上一行對應(yīng)位置的值替換缺失值:
          df.fillna(axis=0,?method='ffill')
          • 用前一列對應(yīng)位置的值替換缺失值:
          df.fillna(axis=1,?method='ffill')
          • 用下一行對應(yīng)位置的值替換缺失值:
          df.fillna(axis=0,?method='bfill')
          • 用后一列對應(yīng)位置的值替換缺失值:
          df.fillna(axis=1,?method='bfill')
          • 使用某一列的平均值替換缺失值:
          df['Age'].fillna(value=df['Age'].mean(),?inplace=True)

          當(dāng)然你還可以用最大最小值、分位數(shù)值等來替換缺失值。

          5. 對連續(xù)數(shù)據(jù)進(jìn)行離散化處理

          在數(shù)據(jù)準(zhǔn)備過程中,常常會組合或者轉(zhuǎn)換現(xiàn)有特征以創(chuàng)建一個新的特征,其中將連續(xù)數(shù)據(jù)離散化是非常重要的特征轉(zhuǎn)化方式,也就是將數(shù)值變成類別特征。

          同樣以泰坦尼克數(shù)據(jù)集為例,里面有一列是年齡特征age:

          import?seaborn?as?sns
          #?導(dǎo)出泰坦尼克數(shù)據(jù)集
          df?=?sns.load_dataset('titanic')
          df['age'].head()

          年齡是一段連續(xù)值,如果我們想對它進(jìn)行分組變成分類特征,比如(<=12,兒童)、(<=18,青少年)、(<=60,成人)、(>60,老人),可以用cut方法實現(xiàn):

          import?sys
          df['ageGroup']=pd.cut(
          ????????????????????df['age'],?
          ????????????????????bins=[0,?13,?19,?61,?sys.maxsize],?
          ????????????????????labels=['兒童',?'青少年',?'成人',?'老人']
          ??????????????????????)

          df.head()

          注意:這里的sys.maxsize是指可以存儲的最大值。

          可以看到新增了一列ageGroup,用以展示年齡分組:

          df['ageGroup'].head()

          6. 從多個文件中構(gòu)建一個DataFrame

          有時候數(shù)據(jù)集可能分布在多個excel或者csv文件中,但需要把它讀取到一個DataFrame中,這樣的需求該如何實現(xiàn)?

          做法是分別讀取這些文件,然后將多個dataframe組合到一起,變成一個dataframe。

          這里使用內(nèi)置的glob模塊,來獲取文件路徑,簡潔且更有效率。

          在上圖中,glob()在指定目錄中查找所有以“ data_row_”開頭的CSV文件。

          glob()以任意順序返回文件名,這就是為什么使用sort()函數(shù)對列表進(jìn)行排序的原因。

          「行合并」

          假設(shè)數(shù)據(jù)集按行分布在2個文件中,分別是data_row_1.csv和data_row_2.csv

          用以下方法可以逐行合并:

          files?=?sorted(glob('data/data_row_*.csv'))
          pd.concat((pd.read_csv(file)?for?file?in?files),?ignore_index=True)

          sorted(glob('data/data_row_*.csv'))返回文件名,然后逐個讀取,并且使用concat()方法進(jìn)行合并,得到結(jié)果:

          「列合并」

          假設(shè)數(shù)據(jù)集按列分布在2個文件中,分別是data_row_1.csv和data_row_2.csv

          用以下方法可以逐列合并:

          files?=?sorted(glob('data/data_col_*.csv'))
          pd.concat((pd.read_csv(file)?for?file?in?files),?axis=1)

          sorted(glob('data/data_row_*.csv'))返回文件名,然后逐個讀取,并且使用concat()方法進(jìn)行列合并(注意這里axis=1),得到結(jié)果:

          本文就到這里,pandas還有很多讓人驚喜的小技巧,大家有興趣也可以在評論區(qū)說說你的使用心得。



          添加微信號"sshs321"加入技術(shù)交流群


          瀏覽 52
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  韩国av三级片麻豆 | 青青操青青操在线视频免费 | 久久无码一区二区三区 | 大屌免费视频 | 乱轮小说网站日韩 |