天天看點

Pandas常用操作方法

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

import pandas as pd
import numpy as np
           

1、建立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
           

資料如下圖:

Pandas常用操作方法

方式2:通過本地資料讀取

從本地檔案中讀取進來。現在本地有一個檔案:

學生資訊.xlsx

直接通過 

pd.read_excel()

讀進來:

df2 = pd.read_excel("學生資訊.xlsx")
df2
           

2、檢視資料相關資訊

df1.shape  # (7,5)    檢視資料shape,shape表示資料是由多少行和列組成
df1.columns           檢視字段屬性名稱
df1.dtypes            檢視屬性的資料類型 (隻有兩種資料類型:int64和object)
df1.isnull()          檢視資料是否缺失
df1.isnull().sum()    統計缺失值的個數。一個True計數一次
df1.index             檢視資料行索引
df1.describe          檢視資料描述資訊(統計值的結果包含:個數count、均值mean、方差std、最值min\max、四分位數25%、中位數50%、四分之三分位數75%。)
           

3、檢視頭尾檔案

通過head和tail方法能夠快速檢視資料的頭尾檔案。

df1.head()    # 預設是檢視前5行資料
df1.head(3)   # 指定顯示的行數
df1.tail()    # 預設尾部5行
df1.tail(3)   # 指定尾部3行資料
           

4、花樣取數

從pandas的DataFrame資料框中取出我們想要的資料,然後進行處理

取出某個字段的資料

我們取出name這列的資料:

name = df1["name"]
name
           

取出多個字段的資料

比如我們取出name和age列的資料:

name_age = df1[["name","age"]]  
name_age
           

根據字段類型選擇資料

比如,我們想選擇字段類型為int64的資料,通過檢視的字段資料類型顯示:age和score都是int64類型

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、多個判斷條件連用

Pandas常用操作方法

第一次使用上面的方法報錯:關鍵詞是

ambiguous

。判斷條件很讓pandas混淆,改成下面的寫法成功解決:

df1[(df1["age"] >= 20) & (df1["age"] < 27)]
           
Pandas常用操作方法

根據字元串取數

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

上面的

王小

不是小開頭,但是包含小,是以也被選出來。

5、切片取數

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

  • start:起始索引,包含
  • stop:結束索引,不包含
  • step:步長,可正可負;

寫法為:[start:stop:step]

步長為正數

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

df1[0:4: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  武漢
           

6、常用函數

統計元素個數

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

⚠️:新資料中df1增加了一列:班級class,後續有作用

Pandas常用操作方法

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

# 統計中每個城市各出現了多少次
address = df1["address"].value_counts()
address
           
Pandas常用操作方法

結果自動是降序排列的Series類型資料

索引重置

索引重置使用

reset_index()

address_new = address.reset_index()
address_new
           
Pandas常用操作方法

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

fale = df1[df1["sex"] == "男"]
fale
           
Pandas常用操作方法

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

fale_1 = fale.reset_index()
fale_1
           
Pandas常用操作方法

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

fale_1 = fale.reset_index(drop=True)  # 加上參數即可解決
fale_1
           
Pandas常用操作方法

屬性重命名

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

address_new = address_new.rename(columns={"index":"address",
                                         "address":"number"
                                        })
address_new
           
Pandas常用操作方法

groupby使用

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

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

Pandas常用操作方法
# 統計男女的總成績:sum

sex_score = df1.groupby("sex")["score"].sum()
sex_score
           
Pandas常用操作方法

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

# 統計男女的平均成績:mean

sex_score = df1.groupby("sex")["score"].mean()
sex_score
           
Pandas常用操作方法

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

# 先根據性别、班級求總分

sex_class = df1.groupby(["sex","class"])["score"].sum()
sex_class
           
Pandas常用操作方法

一行代碼實作上面的功能:

# 一行代碼實作

df1.groupby(["sex","class"])["score"].sum().reset_index()
           
Pandas常用操作方法

apply函數

還是上面的df1資料集:

Pandas常用操作方法

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

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

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

#  自定義函數

def apply_sex(x):
    return 1 if x == "男" else 0

df3 = df1.copy()  # 生成一個副本df3
df3["sex"] = df3["sex"].apply(apply_sex)  # 通過自定義函數解決
df3
           
Pandas常用操作方法

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

# 2、給每個城市加上一個字:市,變成北京市、深圳市等

df4 = df1.copy()

df4["address"] = df4["address"].apply(lambda x: x + "市")
df4
           
Pandas常用操作方法

繼續閱讀