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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

入门Pandas不可不知的技巧

發布時間:2024/9/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 入门Pandas不可不知的技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:Python數據之道

作者:Peter ?整理:陽哥

今天來跟大家分享 Pandas 的一些常用知識點,文章內容由公眾號讀者 Peter 創作。

如果你用 Python 做數據分析,必然會繞不過 Pandas 的使用,實際上, Python 也是由于 numpy、pandas 等數據科學庫的出現,才開始在數據科學領域實現了快速的發展,因此,學好 Pandas 有很重要的現實意義。

本文總結自己經常使用的pandas操作方法:

  • 創建DataFrame數據

  • 查看數據相關信息

  • 查看頭尾文件

  • 花樣取數

  • 切片取數

  • 常見函數使用

首先,導入包

import?pandas?as?pd import?numpy?as?np

01 創建DataFrame數據

方式1:通過字典直接創建

df1?=?pd.DataFrame({"name":["小明","小紅","小孫","王小","關宇","劉蓓","張菲"],"age":[20,18,27,20,28,18,25],"sex":["男","女","男","男","男","女","女"],"score":[669,570,642,590,601,619,701],"address":["北京","深圳","廣州","武漢","深圳","廣州","長沙"] })df1

數據如下圖:

方式2:通過本地數據讀取

從本地文件中讀取進來。現在本地有一個文件:學生信息.xlsx直接通過pd.read_excel()讀進來:

df2?=?pd.read_excel("學生信息.xlsx") df2

可以看到效果和上面是一樣的

02 數據探索

查看數據shape

shape表示數據是由多少行和列組成:

df1.shape??#?(7,5)

查看字段屬性名稱

df1.columns

查看屬性的數據類型

df1.dtypes

可以看到只有兩種數據類型:int64和object

查看數據是否缺失

df1.isnull()???#?如果缺失顯示為True,否則顯示False df1.isnull().sum()?#?統計缺失值的個數。一個True計數一次

結果顯示:本次數據是沒有缺失值的

查看數據行索引

df1.index

查看數據描述信息

df1.describe

查看數據統計值

統計值信息只會顯示類型為數值型的數據統計值信息:

df1.describe()

統計值的結果包含:個數count、均值mean、方差std、最值min\max、四分位數25%、中位數50%、四分之三分位數75%。

03 查看頭尾文件

通過head和tail方法能夠快速查看數據的頭尾文件。

head

df1.head()???#?默認是查看前5行數據 df1.head(3)??#?指定顯示的行數

tail

df1.tail()????#?默認尾部5行 df1.tail(3)???#?指定尾部3行數據

04 花樣取數

從pandas的DataFrame數據框中取出我們想要的數據,然后進行處理

取出某個字段的數據

我們取出name這列的數據:

name?=?df1["name"] name#?結果 0????小明 1????小紅 2????小孫 3????王小 4????關宇 5????劉蓓 6????張菲 Name:?name,?dtype:?object

取出多個字段的數據

比如我們取出name和age列的數據:

name_age?=?df1[["name","age"]]?? name_age#?結果name?age 0?小明?20 1?小紅?18 2?小孫?27 3?王小?20 4?關宇?28 5?劉蓓?18 6?張菲?25

根據字段類型選擇數據

比如,我們想選擇字段類型為int64的數據,通過查看的字段數據類型顯示:age和score都是int64類型

1、選擇單個數據類型

#?1、選擇單個數據類型df1.select_dtypes(include='int64')#?結果age?score 0?20?669 1?18?570 2?27?642 3?20?590 4?28?601 5?18?619 6?25?701

2、同時選擇多個類型

df1.select_dtypes(include=['int64','object'])#?結果name??age?sex?score?address 0?小明??20??男?669????北京 1?小紅??18??女?570????深圳 2?小孫??27??男?642????廣州 3?王小??20??男?590????武漢 4?關宇??28??男?601????深圳 5?劉蓓??18??女?619????廣州 6?張菲??25??女?701????長沙

因為數據中只有int64,object,所以我們全部選出來了。

3、選擇排除某些數據類型之外的數據:

#?選擇除了int64類型之外的數據 #?排除name和score字段之外的數據 df1.select_dtypes(exclude='int64')?#?結果name?sex?address 0?小明?男???北京 1?小紅?女???深圳 2?小孫?男???廣州 3?王小?男???武漢 4?關宇?男???深圳 5?劉蓓?女???廣州 6?張菲?女???長沙

根據數值大小取數

1、直接通過判斷大小來取數:

df1[df1["age"]?==?20]??#?年齡等于20 df1[df1["age"]?!=?20]??#?年齡不等于20 df1[df1["age"]?>=?20]??#?年齡大于等于20

2、多個判斷條件連用

第一次使用上面的方法報錯:關鍵詞是ambiguous。判斷條件很讓pandas混淆,改成下面的寫法成功解決:

df1[(df1["age"]?>=?20)?&?(df1["age"]?<?27)]

根據字符串取數

1、通過單個條件取數

#?1、單條數據 df1[df1["name"]?==?"小明"]??#?結果name??age?sex??score?address 0?小明??20??男???669???北京

2、通過多個條件取數

選擇姓名是小明,或者年齡大于25的數據

df1[(df1["name"]?==?"小明")?|?(df1["age"]?>?25)]#?結果name??age?sex??score?address 0?小明??20??男??669???北京 2?小孫??27??男??642???廣州 4?關宇??28??男??601???深圳

3、字符串的開始、結尾、包含函數

  • str.startswith(string)

  • str.endswith(string)

  • str.contains(string)

#?1、取出以“小”開頭的姓名 df1[df1["name"].str.startswith("小")]??#?name以"小"開頭#?結果name??age?sex??score?address 0?小明?20?男????669?北京 1?小紅?18?女????570?深圳 2?小孫?27?男????642?廣州 #?以“關”開始 df1[df1["name"].str.startswith("關")]#?結果name??age?sex??score?address 4?關宇?28?男????601?深圳 #?3、以“菲”結尾 df1[df1["name"].str.endswith("菲")]#?結果name??age?sex??score?address 6?張菲??25??女???701???長沙 #?取出包含“小”的數據:不管小是在開頭,還是結尾都會被選出來 df1[df1["name"].str.contains("小")]#?結果name??age?sex??score?address 0?小明??20??男??669??北京 1?小紅??18??女??570??深圳 2?小孫??27??男??642??廣州 3?王小??20??男??590??武漢

上面的王小不是小開頭,但是包含小,所以也被選出來。

4、字符串取反操作

取反符號是波浪線:~

下面的例子是:取出名字name中不包含小的數據,只有3個人名字中沒有小字。

#?取出不包含小的數據 df1[~df1["name"].str.contains("小")]#?結果name??age?sex??score?address 4?關宇??28??男??601???深圳 5?劉蓓??18??女??619???廣州 6?張菲??25??女??701???長沙

05 切片取數

切片是Python中存在的概念,在pandas中同樣可以使用。切片中存在3個概念:start、stop、step

  • start:起始索引,包含

  • stop:結束索引,不包含

  • step:步長,可正可負;

寫法為:[start:stop:step]

步長為正數

1、通過下面的3個案例說明:起始索引默認從0開始,步長默認是1

2、指定起始索引,不指定結束索引,表示一直取到數據末尾

df1[4:]??#?從索引4開始取到末尾#?結果name??age?sex??score?address 4?關宇??28??男??601???深圳 5?劉蓓??18??女??619???廣州 6?張菲??25??女??701???長沙

3、改變步長的值

df1[0:4:2]??#?改變步長:每隔2個值取一行數據#?結果name??age?sex??score?address 0?小明??20??男???669???北京 2?小孫??27??男???642???廣州

上面的例子不指定起始索引:

df1[:4:2]??#?默認從0開始

4、只指定步長

df1[::2]???#?從頭到尾,步長為2#?結果name??age?sex??score?address 0?小明??20??男???669???北京 2?小孫??27??男??642???廣州 4?關宇??28??男??601???深圳 6?張菲??25??女??701???長沙

步長為負數

1、步長為-1,默認是倒序輸出結果

df1[::-1]??#?倒序輸出#?結果name??age?sex??score?address 6??張菲???25?女????701??長沙 5??劉蓓???18?女????619??廣州 4??關宇???28?男????601??深圳 3??王小???20?男????590??武漢 2??小孫???27?男????642??廣州 1??小紅???18?女????570??深圳 0??小明???20?男????669??北京

2、步長為負,指定起始和終止索引,起始索引大于終止索引

df1[4:0:-1]name??age?sex??score?address 4?關宇??28??男???601???深圳 3?王小??20??男???590???武漢 2?小孫??27??男???642???廣州 1?小紅??18??女???570???深圳

3、起始和終止索引為負數

df1[-1:-5:-1]??#?最后一行記錄索引為-1,不包含索引為-5的數據name??age?sex??score?address 6?張菲?25?女????701??長沙 5?劉蓓?18?女????619??廣州 4?關宇?28?男????601??深圳 3?王小?20?男????590??武漢

06 常用函數

統計元素個數

很多時候我們需要統計某個列中每個元素出現的個數,相當于是做詞頻統計,使用:value_counts()方法,具體案例為:

??:新數據中df1增加了一列:班級class,后續有作用

比如我們想統計每個城市出現了多少次:

#?統計中每個城市各出現了多少次address?=?df1["address"].value_counts() address

結果自動是降序排列的Series類型數據

索引重置

索引重置使用reset_index():

address_new?=?address.reset_index() address_new

還比如我們想從數據中單獨取出sex="男"的數據:

fale?=?df1[df1["sex"]?==?"男"] fale

我們觀察到數據前面的索引還是原來的,但是我們希望的是從0開始顯示,比較符合我們的習慣:

fale_1?=?fale.reset_index() fale_1

出現的結果中索引是我們想要的結果,但是出現了一列新的數據,就是原來的索引構成的數據,這不是我們想要的數據,需要去除:

fale_1?=?fale.reset_index(drop=True)??#?加上參數即可解決 fale_1

屬性重命名

使用的是rename函數,傳入columsn參數:

address_new?=?address_new.rename(columns={"index":"address","address":"number"}) address_new

groupby使用

groupby主要是實現分組統計的功能:

1、比如我們想統計男女各自的總分

#?統計男女的總成績:sumsex_score?=?df1.groupby("sex")["score"].sum() sex_score

2、求男女各自的平均分mean

#?統計男女的平均成績:meansex_score?=?df1.groupby("sex")["score"].mean() sex_score

3、根據男女性別sex、班級class求總分

#?先根據性別、班級求總分sex_class?=?df1.groupby(["sex","class"])["score"].sum() sex_class

一行代碼實現上面的功能

#?一行代碼實現df1.groupby(["sex","class"])["score"].sum().reset_index()

apply函數

還是上面的df1數據集:

1、需求1:我們想將性別中的男變成1,女變成0

# 1、改變:男-1,女-0df2?=?df1.copy()??#?生成一個副本df2["sex"]?=?df2["sex"].apply(lambda?x:?1?if?x=="男"?else?0)??#?通過匿名函數解決 df2

我們還可以自定義一個函數來實現:

#??自定義函數def?apply_sex(x):return?1?if?x?==?"男"?else?0df3?=?df1.copy()??#?生成一個副本df3df3["sex"]?=?df3["sex"].apply(apply_sex)??#?通過自定義函數解決 df3

2、還比如我們想給每個城市的后面加上一個“市”,變成北京市、深圳市等:

# 2、給每個城市加上一個字:市,變成北京市、深圳市等df4?=?df1.copy()df4["address"]?=?df4["address"].apply(lambda?x:?x?+?"市") df4

總結

本文中從pandas中DataFrame數據的創建,常見數據信息的探索,再到如何從數據框中獲取到我們指定的數據,最后介紹了筆者常用的處理數據的方法,希望對入門或者對不熟悉pandas的朋友有所幫助。Pandas真的是十分強大,學好之后會大大節省我們處理數據的時間。

作者簡介

Peter,碩士畢業僧一枚,從電子專業自學Python入門數據行業,擅長數據分析及可視化。個人站點:www.renpeter.cn

推薦閱讀

Pandas處理數據太慢,來試試Polars吧!

懶人必備!只需一行代碼,就能導入所有的Python庫

絕!關于pip的15個使用小技巧

介紹10個常用的Python內置函數,99.99%的人都在用!

可能是全網最完整的 Python 操作 Excel庫總結!

總結

以上是生活随笔為你收集整理的入门Pandas不可不知的技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

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