入门Pandas不可不知的技巧
來源:Python數據之道
作者:Peter ?整理:陽哥
今天來跟大家分享 Pandas 的一些常用知識點,文章內容由公眾號讀者 Peter 創作。
如果你用 Python 做數據分析,必然會繞不過 Pandas 的使用,實際上, Python 也是由于 numpy、pandas 等數據科學庫的出現,才開始在數據科學領域實現了快速的發展,因此,學好 Pandas 有很重要的現實意義。
本文總結自己經常使用的pandas操作方法:
創建DataFrame數據
查看數據相關信息
查看頭尾文件
花樣取數
切片取數
常見函數使用
首先,導入包
import?pandas?as?pd import?numpy?as?np01 創建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?7012、同時選擇多個類型
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]??#?年齡大于等于202、多個判斷條件連用
第一次使用上面的方法報錯:關鍵詞是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)
上面的王小不是小開頭,但是包含小,所以也被選出來。
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_newgroupby使用
groupby主要是實現分組統計的功能:
1、比如我們想統計男女各自的總分
#?統計男女的總成績:sumsex_score?=?df1.groupby("sex")["score"].sum() sex_score2、求男女各自的平均分mean
#?統計男女的平均成績:meansex_score?=?df1.groupby("sex")["score"].mean() sex_score3、根據男女性別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)??#?通過自定義函數解決 df32、還比如我們想給每個城市的后面加上一個“市”,變成北京市、深圳市等:
# 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不可不知的技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嘘,Python 优化提速的 8 个小技
- 下一篇: Pandas直接读取arff格式的文件,