主頁 >  其他 > 資料分析 -- Pandas③

資料分析 -- Pandas③

2022-01-30 08:40:23 其他

目錄

  • 表格合并
    • 縱向合并
    • 縱向合并
  • 資料清洗
    • 洗掉缺失資料行
    • 資料填充
    • 統一資料格式
    • 去除重復資料
  • pandas 中很實用的方法——apply() 方法
  • 附:匿名函式

表格合并

縱向合并

在日常作業中,表格合并是個較為常見的需求,還是以之前的銷售資料為例,一般是每個團隊只統計自己團隊的銷售資料,然后匯總給負責人進行資料匯總,得到最后的總表,
ABCD 四個團隊的銷售表分別如下,我們縱向合并表格,也就是將表格內容從上往下進行疊加,
在這里插入圖片描述

這在 pandas 中使用 concat() 方法,將要合并的表放入串列中作為引數

pd.concat([df1, df2])

應用到我們的例子中,完整代碼如下:

import pandas as pd

df_a = pd.read_csv('2019年團隊A銷售資料.csv')
df_b = pd.read_csv('2019年團隊B銷售資料.csv')
df_c = pd.read_csv('2019年團隊C銷售資料.csv')
df_d = pd.read_csv('2019年團隊D銷售資料.csv')

df = pd.concat([df_a, df_b, df_c, df_d])
print(type(df))
# 輸出:<class 'pandas.core.frame.DataFrame'>

可以看到,合并后也是一個 DataFrame 型別的表格,
在這里插入圖片描述

縱向合并

除了表格的縱向合并,還有一種情況——表格的橫向合并,
假設團隊 A 的銷售資料分為上半年和下半年的資料,兩個表分別如下圖所示:
在這里插入圖片描述
將這兩個表格進行橫向合并最簡單的方法是 pd.merge(表一, 表二),合并后得到如下所示的新表:
在這里插入圖片描述
上面的例子是 merge() 方法最簡單的情況,只傳入兩個需要橫向合并的表格作為引數,merge() 方法還有兩個比較重要的引數分別是 onhow

引數 on 表明用于合并的列名,可以使用串列指定多個列名,這些列名必須同時存在于兩個表格當中,如果沒有指定引數 on,那么 pandas 會自動將兩個表格都有的列名作為引數 on 的值,

在上面的列子中引數 on 默認就是銷售員,合并時 pandas 會將銷售員這列值一樣的行進行橫向合并,并不是簡單地按順序合并,因此兩張表的排列順序不一樣也能正確地進行合并,

上面例子中的兩個表格情況比較簡單,銷售員都是一樣的,假設劉一在第三四季度離職了,表格變成了下面這樣:
在這里插入圖片描述
這時候,pd.merge(表一, 表二) 后的結果如下:
在這里插入圖片描述
可以看到,合并后劉一的資料被剔除了,這其實是引數 how 導致的,引數 how 指定了合并的方式,總共有四種方式可選,默認為 inner,

  • left
  • right
  • outer
  • inner(默認)

inner(內連接)表示只保留引數 on 指定的列(上面的例子中是銷售員)中兩個表格都出現的部分,因為劉一只在表一中出現,因此合并后就剔除了劉一這行資料,

outer(外連接)和 inner 相反,它會保留兩個表格中所有的資料,資料缺失部分以 NaN 填充,即以 NaN 填充上面的例子中劉一在第三四季度的資料,

注意,如果某列中用 NaN 補全了空位,那這一列資料就會變為浮點型資料,

在這里插入圖片描述
left(左連接)表示將表二合并到表一中,具體指保留表一的全部資料,將表二中兩表中共同的銷售員資料進行合并,剔除表二中獨有的資料,缺失資料同樣也是用 NaN 填充,right(右連接)正好相反,表示將表一合并到表二中,

在這里插入圖片描述

資料清洗

之前我們的資料都是很完整,格式也都是統一的,但有些時候,我們的資料可能存在部分缺失、格式不統一、甚至資料錯誤等情況,這時候這些資料就成了“臟”資料,我們需要對其進行資料清洗,

資料缺失是最常見的問題之一,導致這個問題的原因可能是:人工填寫時遺漏、本身就沒有這項資料等等,
我對豆瓣圖書 Top250 資料進行了些洗掉,故意造成資料缺失,以便于我們對它進行資料清洗,
在這里插入圖片描述
讀取表格檔案后,呼叫 info() 方法和 describe() 方法可以看到如下資訊:
在這里插入圖片描述
從中可知:總共 250 條資料,價格缺失了 2 條資料,資料缺失會引起后續資料分析的錯誤,常見的處理資料缺失的方法有 洗掉缺失資料行為缺失資料賦值

洗掉缺失資料行

假設我們認為有缺失資料的那一行資料都不可信,需要將其洗掉,只需一行代碼即可:

df.dropna()

dropna() 方法的作用是洗掉所有包含 NaN 的行,執行后上表中資料缺失的那 2 行資料就會被洗掉,
dropna() 方法同樣也是回傳洗掉后的表格,不會對原表格有影響,如需直接在原表格上洗掉,傳入 inplace=True 即可,

但上面的方法過于簡單粗暴,可能只是一個不影響分析的資料缺失了,也會被無情地洗掉,所以我們要有策略地進行洗掉,
我們可以傳入 how='all' 來控制當這一行資料都為 NaN 時才洗掉這一行,how 默認為 any,表示只要有一個 NaN 就會洗掉這一行,

df.dropna(how='all')

我們也可以傳入 thresh 引數來控制當一行中非空值數量小于多少時才洗掉此行,比如當一行資料中,非空值數量小于 5 個時洗掉這一行,代碼就可以這樣寫:

df.dropna(thresh=5)

當我們只想分析價格時,其他資料的缺失對我們的分析沒有影響,這時可以通過 subset 引數決定哪幾列有資料缺失時才進行洗掉,比如,當書名和價格這兩列有資料缺失時可以這樣寫:

df.dropna(subset=['書名', '價格'])

綜上:
在這里插入圖片描述

資料填充

除了洗掉缺失資料行,有些情況下我們還能為缺失資料賦值,比如價格缺失了,我們可以將缺失價格設定為 0,方法如下:

df['價格'].fillna(0)

首先是選取有資料缺失的列,然后呼叫 fillna() 方法,該方法會將傳入的引數填充到該列所有缺失的資料中,

我們同樣可以傳入 inplace=True 來直接更改原表格,pandas 中大部分方法都是回傳修改后的表格,而不會修改原表格,我們都可以傳入 inplace=True 來直接修改原表格,如果不想修改原表格,只需將修改后的表格保存到新的變數中即可,

但將缺失價格直接設成 0 并不是最優解,它會拉低整體的價格,我們可以將其設定成比較接近的值,比如價格的平均值:

df['價格'].fillna(df['價格'].mean())

像這樣處理后,資料的偏差會小一些,上面的代碼是理想情況,實際上會報錯,為什么呢?我們再來看一下我們的資料表格,
在這里插入圖片描述
可以看到,除了資料缺失知道,價格這一列的資料格式還不統一,有的是整數,有的是小數,還有的后面加上了元,這樣的資料我們也沒有辦法進行分析,需要將其格式統一,我們需要去除“元”字,再統一保留一位小數,

統一資料格式

首先是去除“元”字,這其實就是字串處理,在 Python 中,可以使用 replace() 方法進行字串替換,我們可以像下面這樣去除“元”字:

'29.00元'.replace('元', '')

而在 pandas 中也有這些字串方法,它藏在了 str 屬性下面,所以在 pandas 中我們可以這么寫:

df['價格'].str.replace('元', '')

先訪問 str 屬性,再呼叫里面的字串方法,Python 里的字串方法,比如 replace()upper()lower()split() 等等在其中,

需要注意的是,因為字串不可變,這些方法都只是回傳新的資料,不會更改原字串,因此,我們還需要像下面這樣才能將原表格中價格這一列的資料替換成修改后的資料:

df['價格'] = df['價格'].str.replace('元', '')

這樣處理完之后看上去是數字,但實際上型別還是字串,我們需要使用 astype() 方法進行型別轉換,價格是小數,所以我們將其轉換成浮點數型別(float),

df['價格'] = df['價格'].str.replace('元', '').astype('float')

對價格進行處理后的表格是這樣的:
在這里插入圖片描述
除了缺失資料還是 NaN,其他價格都統一成了保留一位小數的浮點數,這時我們再執行 df.describe() 看一下處理過后的資料:
在這里插入圖片描述
因為價格這一列被我們處理成數字了,所以統計資訊中出現了價格相關的資訊,并且這時再執行 df[‘價格’].fillna(df[‘價格’].mean()) 也不會報錯了,
但算出來的平均價格是 33.090161,然而我們并不需要精確到小數點后這么多位,因此我們可以使用 round() 方法進行四舍五入,引數是要保留的小數位數,所以最后的代碼如下:

df['價格'].fillna(df['價格'].mean().round(1), inplace=True)  # 保留 1 位小數

去除重復資料

首先我們故意創建一個含有重復資料的表格進行演示:

import pandas as pd

df = pd.DataFrame({'用戶名': ['劉一', '陳二', '劉一', '張三'], '交易金額': [25.8, 15.5, 56.3, 46.2]})
repeat = pd.concat([df, df])
print(repeat)
   用戶名   交易金額
0   劉一      25.8
1   陳二      15.5
2   劉一      56.3
3   張三      46.2
0   劉一      25.8
1   陳二      15.5
2   劉一      56.3
3   張三      46.2

我將同一份表格進行了合并,得到了一個含有重復資料的表格,我們可以呼叫 drop_duplicates() 方法洗掉完全重復的行,即每一列的資料都完全相同的行,

print(repeat.drop_duplicates())

結果:

   用戶名   交易金額
0   劉一      25.8
1   陳二      15.5
2   劉一      56.3
3   張三      46.2

我們還可以通過 subset 引數指定按列去重,即只要這一列的資料重復就會洗掉重復的內容,

print(repeat.drop_duplicates(subset=['用戶名']))
   用戶名   交易金額
0   劉一      25.8
1   陳二      15.5
3   張三      46.2

可以看到,按照用戶名進行去重劉一的兩條記錄只剩一條了,去重默認是保留第一條不重復的資料,如果你想保留最后一條不重復的資料,可以傳入 keep='last'

print(repeat.drop_duplicates(subset=['用戶名'], keep='last'))
   用戶名   交易金額
1   陳二      15.5
2   劉一      56.3
3   張三      46.2

假設資料的順序是按交易時間排的,上面的代碼就能得到每個用戶最近一次的交易記錄,
在這里插入圖片描述
前面說的是如何去重,那么我們想要知道不重復的資料有哪些該怎么辦呢?其實也很簡單,只要在對應的列上呼叫 unique() 方法即可,

print(repeat['用戶名'].unique())
# 輸出:['劉一' '陳二' '張三']

print(len(repeat['用戶名'].unique()))
# 輸出:3

可以看到,總共 8 條資料交易記錄,實際上只是 3 名用戶產生的交易,除了使用 len(repeat[‘用戶名’].unique()) 統計不重復的個數之外,我們也可以直接使用 nunique() 方法得到它,

print(repeat['用戶名'].nunique())
# 輸出:3

綜上:
在這里插入圖片描述

pandas 中很實用的方法——apply() 方法

apply() 方法的第一個引數是一個函式,當我們傳入函式后,apply() 方法會將該函式應用到表格列里的每一個資料中,并將表格資料作為引數傳給函式,(有點映射的味道)

在這里插入圖片描述

比如:

# 沒使用apply() 方法
df['價格'] = df['價格'].str.replace('元', '').astype('float')

# 使用了apply() 方法
def format_price(x):
  return float(x.replace('元', ''))

df['價格'] = df['價格'].apply(format_price)

看上去代碼更多了,但只是定義函式比較長,我們使用匿名函式的話也可以一行搞定:

f['價格'] = df['價格'].apply(lambda x: float(x.replace('元', '')))

之前我們使用的是 pandas 中的方法進行資料處理的,前提是你得先知道有 str 屬性、astype() 方法等,而使用 apply() 方法則很靈活,我們可以直接獲取到資料,使用 Python 的方式進行處理,同時處理的規則可以非常靈活,只要按需求定義一個函式即可,

附:匿名函式

Python 中的匿名函式:
在這里插入圖片描述
下面這張是匿名函式和普通函式的對比圖:
在這里插入圖片描述
使用匿名函式并不能提高代碼的運行效率,只是讓代碼看上去更加的簡潔而已,有些只會用一次的函式,不知道如何給它命名時,直接用匿名函式會很方便,

我們還可以將匿名函式賦值給變數,這樣匿名函式也擁有了姓名,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423179.html

標籤:其他

上一篇:當redis 主節點宕機重啟以后,該節點不能跟選舉后的master資料主從同步

下一篇:JUC并發編程-生產者消費者實體

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more