日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 数据分析三剑客之 Pandas(三):算术运算与缺失值的处理

發布時間:2023/12/10 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 数据分析三剑客之 Pandas(三):算术运算与缺失值的处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CSDN 課程推薦:《邁向數據科學家:帶你玩轉Python數據分析》,講師齊偉,蘇州研途教育科技有限公司CTO,蘇州大學應用統計專業碩士生指導委員會委員;已出版《跟老齊學Python:輕松入門》《跟老齊學Python:Django實戰》、《跟老齊學Python:數據分析》和《Python大學實用教程》暢銷圖書。


Pandas 系列文章:

  • Python 數據分析三劍客之 Pandas(一):認識 Pandas 及其 Series、DataFrame 對象
  • Python 數據分析三劍客之 Pandas(二):Index 索引對象以及各種索引操作
  • Python 數據分析三劍客之 Pandas(三):算術運算與缺失值的處理
  • Python 數據分析三劍客之 Pandas(四):函數應用、映射、排序和層級索引
  • Python 數據分析三劍客之 Pandas(五):統計計算與統計描述
  • Python 數據分析三劍客之 Pandas(六):GroupBy 數據分裂、應用與合并
  • Python 數據分析三劍客之 Pandas(七):合并數據集
  • Python 數據分析三劍客之 Pandas(八):數據重塑、重復數據處理與數據替換
  • Python 數據分析三劍客之 Pandas(九):時間序列
  • Python 數據分析三劍客之 Pandas(十):數據讀寫

另有 NumPy、Matplotlib 系列文章已更新完畢,歡迎關注:

  • NumPy 系列文章:https://itrhx.blog.csdn.net/category_9780393.html
  • Matplotlib 系列文章:https://itrhx.blog.csdn.net/category_9780418.html

推薦學習資料與網站(博主參與部分文檔翻譯):

  • NumPy 官方中文網:https://www.numpy.org.cn/
  • Pandas 官方中文網:https://www.pypandas.cn/
  • Matplotlib 官方中文網:https://www.matplotlib.org.cn/
  • NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table

文章目錄

    • 【01x00】Pandas 算術運算
      • 【01x01】使用 NumPy 通用函數
      • 【01x02】數據對齊
      • 【01x03】DataFrame 與 Series 之間的運算
      • 【01x04】Pandas 算術方法
    • 【02x00】處理缺失值
      • 【02x01】fill_value() 指定值與缺失值進行運算
      • 【02x02】isnull() / notnull() 判斷缺失值
      • 【02x03】dropna() 刪除缺失值
      • 【02x04】fillna() 填充缺失值


這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106743778 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!

【01x00】Pandas 算術運算

Pandas 繼承了 NumPy 的功能,NumPy 的基本能力之一是快速對每個元素進行運算,既包括基本算術運算(加、減、乘、除),也包括更復雜的運算(三角函數、指數函數和對數函數等)。具體可以參考 NumPy 系列文章。

【01x01】使用 NumPy 通用函數

因為 Pandas 是建立在 NumPy 基礎之上的,所以 NumPy 的通用函數同樣適用于 Pandas 的 Series 和 DataFrame 對象,如下所示:

>>> import pandas as pd >>> import numpy as np >>> rng = np.random.RandomState(42) >>> ser = pd.Series(rng.randint(0, 10, 4)) >>> ser 0 6 1 3 2 7 3 4 dtype: int32 >>> >>> obj = pd.DataFrame(rng.randint(0, 10, (3, 4)), columns=['A', 'B', 'C', 'D']) >>> objA B C D 0 6 9 2 6 1 7 4 3 7 2 7 2 5 4

使用 NumPy 通用函數,生成的結果是另一個保留索引的 Pandas 對象:

>>> import pandas as pd >>> import numpy as np >>> rng = np.random.RandomState(42) >>> ser = pd.Series(rng.randint(0, 10, 4)) >>> ser 0 6 1 3 2 7 3 4 dtype: int32 >>> >>> np.exp(ser) 0 403.428793 1 20.085537 2 1096.633158 3 54.598150 dtype: float64 >>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame(rng.randint(0, 10, (3, 4)), columns=['A', 'B', 'C', 'D']) >>> np.sin(obj * np.pi / 4)A B C D 0 -1.000000 7.071068e-01 1.000000 -1.000000e+00 1 -0.707107 1.224647e-16 0.707107 -7.071068e-01 2 -0.707107 1.000000e+00 -0.707107 1.224647e-16

【01x02】數據對齊

Pandas 最重要的一個功能是,它可以對不同索引的對象進行算術運算。在將對象相加時,如果存在不同的索引對,則結果的索引就是該索引對的并集。自動的數據對齊操作會在不重疊的索引處引入缺失值,即 NaN,缺失值會在算術運算過程中傳播。

Series 對象的數據對齊操作:

>>> import pandas as pd >>> obj1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e']) >>> obj2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g']) >>> obj1 a 7.3 c -2.5 d 3.4 e 1.5 dtype: float64 >>> >>> obj2 a -2.1 c 3.6 e -1.5 f 4.0 g 3.1 dtype: float64 >>> >>> obj1 + obj2 a 5.2 c 1.1 d NaN e 0.0 f NaN g NaN dtype: float64

DataFrame 對象的數據對齊操作會同時發生在行和列上:

>>> import pandas as pd >>> obj1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'), index=['Ohio', 'Texas', 'Colorado']) >>> obj2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon']) >>> obj1b c d Ohio 0.0 1.0 2.0 Texas 3.0 4.0 5.0 Colorado 6.0 7.0 8.0 >>> >>> obj2b d e Utah 0.0 1.0 2.0 Ohio 3.0 4.0 5.0 Texas 6.0 7.0 8.0 Oregon 9.0 10.0 11.0 >>> >>> obj1 + obj2b c d e Colorado NaN NaN NaN NaN Ohio 3.0 NaN 6.0 NaN Oregon NaN NaN NaN NaN Texas 9.0 NaN 12.0 NaN Utah NaN NaN NaN NaN

【01x03】DataFrame 與 Series 之間的運算

首先回憶 NumPy 中的廣播(參見:《Python 數據分析三劍客之 NumPy(二):數組索引 / 切片 / 廣播 / 拼接 / 分割》),跟不同維度的 NumPy 數組一樣,DataFrame 和 Series 之間算術運算也是有明確規定的。首先回憶一下 NumPy 中不同維度的數組之間的運算:

>>> import numpy as np >>> arr = np.arange(12.).reshape((3, 4)) >>> arr array([[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.]]) >>> >>> arr[0] array([0., 1., 2., 3.]) >>> >>> arr - arr[0] array([[0., 0., 0., 0.],[4., 4., 4., 4.],[8., 8., 8., 8.]])

可以看到每一行都進行了減法運算,這正是 NumPy 中的廣播,而 DataFrame 與 Series 之間的運算也類似,默認情況下,DataFrame 和 Series 之間的算術運算會將 Series 的索引匹配到 DataFrame 的列,然后沿著行一直向下廣播:

>>> import numpy as np >>> import pandas as pd >>> frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['AA', 'BB', 'CC', 'DD']) >>> frameb d e AA 0.0 1.0 2.0 BB 3.0 4.0 5.0 CC 6.0 7.0 8.0 DD 9.0 10.0 11.0 >>> >>> series = frame.iloc[0] >>> series b 0.0 d 1.0 e 2.0 Name: AA, dtype: float64 >>> >>> frame - seriesb d e AA 0.0 0.0 0.0 BB 3.0 3.0 3.0 CC 6.0 6.0 6.0 DD 9.0 9.0 9.0

如果某個索引值在 DataFrame 的列或 Series 的索引中找不到,則參與運算的兩個對象就會被重新索引以形成并集:

>>> import numpy as np >>> import pandas as pd >>> frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['AA', 'BB', 'CC', 'DD']) >>> frameb d e AA 0.0 1.0 2.0 BB 3.0 4.0 5.0 CC 6.0 7.0 8.0 DD 9.0 10.0 11.0 >>> >>> series = pd.Series(range(3), index=['b', 'e', 'f']) >>> series b 0 e 1 f 2 dtype: int64 >>> >>> frame + seriesb d e f AA 0.0 NaN 3.0 NaN BB 3.0 NaN 6.0 NaN CC 6.0 NaN 9.0 NaN DD 9.0 NaN 12.0 NaN

如果希望匹配行且在列上廣播,則必須使用算術運算方法,在方法中傳入的軸(axis)就是希望匹配的軸。在下例中,我們的目的是匹配 DataFrame 的行索引(axis=‘index’ or axis=0)并進行廣播:

>>> import numpy as np >>> import pandas as pd >>> frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['AA', 'BB', 'CC', 'DD']) >>> frameb d e AA 0.0 1.0 2.0 BB 3.0 4.0 5.0 CC 6.0 7.0 8.0 DD 9.0 10.0 11.0 >>> >>> series = frame['d'] >>> series AA 1.0 BB 4.0 CC 7.0 DD 10.0 Name: d, dtype: float64 >>> >>> frame.sub(series, axis='index')b d e AA -1.0 0.0 1.0 BB -1.0 0.0 1.0 CC -1.0 0.0 1.0 DD -1.0 0.0 1.0

【01x04】Pandas 算術方法

完整的 Pandas 算術方法見下表:

方法副本描述
add()radd()加法(+)
sub()、subtract()rsub()減法(-)
mul()、multiply()rmul()乘法(*)
pow()rpow()指數(**)
truediv()、div()、divide()rdiv()除法(/)
floordiv()rfloordiv()底除(//)
mod()rmod()求余(%)

副本均為原方法前加了個 r,它會翻轉參數:

>>> import pandas as pd >>> obj = pd.DataFrame(np.arange(12.).reshape((3, 4)), columns=list('abcd')) >>> obja b c d 0 0.0 1.0 2.0 3.0 1 4.0 5.0 6.0 7.0 2 8.0 9.0 10.0 11.0 >>> >>> 1 / obja b c d 0 inf 1.000000 0.500000 0.333333 1 0.250 0.200000 0.166667 0.142857 2 0.125 0.111111 0.100000 0.090909 >>> >>> obj.rdiv(1)a b c d 0 inf 1.000000 0.500000 0.333333 1 0.250 0.200000 0.166667 0.142857 2 0.125 0.111111 0.100000 0.090909
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106743778 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!

【02x00】處理缺失值

在現實中遇到的數據很少是干凈整齊的,許多數據集都會有數據缺失的現象,缺失值主要有三種形式:null、NaN(NAN,nan) 或 NA。

【02x01】fill_value() 指定值與缺失值進行運算

使用 add, sub, div, mul 等算術方法時,通過 fill_value 指定填充值,未對齊的數據將和填充值做運算。

Series 中的應用:

>>> import pandas as pd >>> obj1 = pd.Series([1, 2, 3, 4, 5]) >>> obj2 = pd.Series([6, 7]) >>> >>> obj1 0 1 1 2 2 3 3 4 4 5 dtype: int64 >>> >>> obj2 0 6 1 7 dtype: int64 >>> >>> obj1.add(obj2) 0 7.0 1 9.0 2 NaN 3 NaN 4 NaN dtype: float64 >>> >>> obj1.add(obj2, fill_value=-1) 0 7.0 1 9.0 2 2.0 3 3.0 4 4.0 dtype: float64

DataFrame 中的應用:

>>> import pandas as pd >>> import numpy as np >>> obj1 = pd.DataFrame(np.arange(12.).reshape((3, 4)), columns=list('abcd')) >>> obj2 = pd.DataFrame(np.arange(20.).reshape((4, 5)), columns=list('abcde')) >>> >>> obj2.loc[1, 'b'] = np.nan >>> >>> obj1a b c d 0 0.0 1.0 2.0 3.0 1 4.0 5.0 6.0 7.0 2 8.0 9.0 10.0 11.0 >>> >>> obj2a b c d e 0 0.0 1.0 2.0 3.0 4.0 1 5.0 NaN 7.0 8.0 9.0 2 10.0 11.0 12.0 13.0 14.0 3 15.0 16.0 17.0 18.0 19.0 >>> >>> obj1 + obj2a b c d e 0 0.0 2.0 4.0 6.0 NaN 1 9.0 NaN 13.0 15.0 NaN 2 18.0 20.0 22.0 24.0 NaN 3 NaN NaN NaN NaN NaN >>> >>> obj1.add(obj2, fill_value=10)a b c d e 0 0.0 2.0 4.0 6.0 14.0 1 9.0 15.0 13.0 15.0 19.0 2 18.0 20.0 22.0 24.0 24.0 3 25.0 26.0 27.0 28.0 29.0

【02x02】isnull() / notnull() 判斷缺失值

isnull():為缺失值時為 True,否則為 False;

notnull() 為缺失值時為 False,否則為 True。

>>> import numpy as np >>> import pandas as pd >>> obj = pd.Series([1, np.nan, 'hello', None]) >>> obj 0 1 1 NaN 2 hello 3 None dtype: object >>> >>> obj.isnull() 0 False 1 True 2 False 3 True dtype: bool >>> >>> obj.notnull() 0 True 1 False 2 True 3 False dtype: bool

【02x03】dropna() 刪除缺失值

dropna() 方法用于返回一個刪除了缺失值的新 Series 或 DataFrame 對象。

在 Series 對象當中,dropna() 方法的語法如下(其他參數用法可參考在 DataFrame 中的應用):

Series.dropna(self, axis=0, inplace=False, how=None)

官方文檔:https://pandas.pydata.org/docs/reference/api/pandas.Series.dropna.html

>>> import numpy as np >>> import pandas as pd >>> obj = pd.Series([1, np.nan, 'hello', None]) >>> obj 0 1 1 NaN 2 hello 3 None dtype: object >>> >>> obj.dropna() 0 1 2 hello dtype: object

在 DataFrame 對象中,dropna() 方法的語法如下:

DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)

官方文檔:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html

參數描述
axis確定是否刪除包含缺失值的行或列
0 或 'index':刪除包含缺失值的行。1 或 'columns':刪除包含缺失值的列
how'any':如果存在任何NA值,則刪除該行或列。'all':如果所有值都是NA,則刪除該行或列
thresh設置行或列中非缺失值的最小數量

不傳遞任何參數,將會刪除任何包含缺失值的整行數據:

>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]]) >>> obj0 1 2 0 1.0 NaN 2 1 2.0 3.0 5 2 NaN 4.0 6 >>> >>> obj.dropna()0 1 2 1 2.0 3.0 5

指定 axis 參數,刪除包含缺失值的行或列:

>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]]) >>> obj0 1 2 0 1.0 NaN 2 1 2.0 3.0 5 2 NaN 4.0 6 >>> >>> obj.dropna(axis='columns')2 0 2 1 5 2 6

指定 how 參數,'any':如果存在任何NA值,則刪除該行或列。'all':如果所有值都是NA,則刪除該行或列:

>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame([[1, np.nan, 2, np.nan], [2, 3, 5, np.nan], [np.nan, 4, 6, np.nan]]) >>> obj0 1 2 3 0 1.0 NaN 2 NaN 1 2.0 3.0 5 NaN 2 NaN 4.0 6 NaN >>> obj.dropna(axis='columns', how='all')0 1 2 0 1.0 NaN 2 1 2.0 3.0 5 2 NaN 4.0 6

指定 thresh 參數,設置行或列中非缺失值的最小數量,以下示例中,第一行和第三行只有兩個非缺失值,所以會被刪除:

>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame([[1, np.nan, 2, np.nan], [2, 3, 5, np.nan], [np.nan, 4, 6, np.nan]]) >>> obj0 1 2 3 0 1.0 NaN 2 NaN 1 2.0 3.0 5 NaN 2 NaN 4.0 6 NaN >>> >>> obj.dropna(axis='rows', thresh=3)0 1 2 3 1 2.0 3.0 5 NaN

【02x04】fillna() 填充缺失值

fillna() 方法可以將缺失值替換成有效的數值。

在 Series 對象中,fillna() 方法的語法如下:

Series.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

官方文檔:https://pandas.pydata.org/docs/reference/api/pandas.Series.fillna.html

參數描述
value用于填充的值(例如 0),或者是一個 dict / Series / DataFrame 值
指定要用于每個 index(對于 Series)或column(對于 DataFrame)的值
不在dict / Series / DataFrame中的值將不被填充。此值不能是列表
method填充方法:None
‘pad’ / ‘ffill’:將上一個有效觀測值向前傳播到下一個有效觀測值
‘backfill’ / ‘bfill’:使用下一個有效觀察值來填補空白
axis0 or ‘index’,要填充缺失值的軸
>>> import pandas as pd >>> obj = pd.Series([1, np.nan, 2, None, 3], index=list('abcde')) >>> obj a 1.0 b NaN c 2.0 d NaN e 3.0 dtype: float64 >>> >>> obj.fillna(0) a 1.0 b 0.0 c 2.0 d 0.0 e 3.0 dtype: float64 >>> >>> obj.fillna(method='ffill') a 1.0 b 1.0 c 2.0 d 2.0 e 3.0 dtype: float64 >>> >>> obj.fillna(method='bfill') a 1.0 b 2.0 c 2.0 d 3.0 e 3.0 dtype: float64

在 DataFrame 對象中,fillna() 方法的語法如下:

DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

官方文檔:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.fillna.html

參數描述
value用于填充的值(例如 0),或者是一個 dict / Series / DataFrame 值
指定要用于每個 index(對于 Series)或column(對于 DataFrame)的值
不在dict / Series / DataFrame中的值將不被填充。此值不能是列表
method填充方法:None
‘pad’ / ‘ffill’:將上一個有效觀測值向前傳播到下一個有效觀測值
‘backfill’ / ‘bfill’:使用下一個有效觀察值來填補空白
axis0 or ‘index’,1 or ‘columns’,要填充缺失值的軸

在 DataFrame 對象中的用法和在 Series 對象中的用法大同小異,只不過 axis 參數多了一個選擇:

>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame([[1, np.nan, 2, np.nan], [2, 3, 5, np.nan], [np.nan, 4, 6, np.nan]]) >>> obj0 1 2 3 0 1.0 NaN 2 NaN 1 2.0 3.0 5 NaN 2 NaN 4.0 6 NaN >>> >>> obj.fillna(method='ffill', axis=1)0 1 2 3 0 1.0 1.0 2.0 2.0 1 2.0 3.0 5.0 5.0 2 NaN 4.0 6.0 6.0
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106743778 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!

總結

以上是生活随笔為你收集整理的Python 数据分析三剑客之 Pandas(三):算术运算与缺失值的处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。