最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你掌握Python Pandas數(shù)據(jù)處理的三大實(shí)用技巧

 更新時(shí)間:2026年01月06日 09:02:17   作者:杰瑞不懂代碼  
本文主要為大家介紹了使用pandas進(jìn)行數(shù)據(jù)處理的方法,主要包括DataFrame新增列的多種實(shí)現(xiàn)方式,pandas常見的數(shù)據(jù)統(tǒng)計(jì)功能以及缺失值處理方法,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下

同樣我們使用上節(jié)課的 DATA.xlsx 文件,來進(jìn)行本節(jié)課的演示,數(shù)據(jù)如下:

一、如何對DataFrame新增列

1.1 直接運(yùn)算實(shí)現(xiàn)

我們新增一個(gè)“業(yè)績總分” 列,為“銷售數(shù)量” 乘以 “客戶評分

print(df.head(3))
df.loc[:,"業(yè)績總分"] = df["銷售數(shù)量"] * df["客戶評分"]
print("="*60)
print(df.head(3))

輸出如下,可以發(fā)現(xiàn)運(yùn)算過后,最后多了一列業(yè)績總分,也就是成功新增了一列:

1.2 Apply方法增加列

apply方法的直接使用用法是這樣,這里我們通過performance函數(shù)接受df,然后進(jìn)行判斷,根據(jù)不同的安全等級(jí)劃分性能

def performance(df):
    if df["安全等級(jí)"] == "A" or df["安全等級(jí)"] == "B":
        return "好"
    elif df["安全等級(jí)"] == "C" or df["安全等級(jí)"] == "D":
        return "一般"

# axis=1 表示一行一行處理數(shù)據(jù), 如果是一列一列處理數(shù)據(jù)的話就是 axis=0
df.loc[:,"性能"] = df.apply(performance,axis=1)
print(df.head(3))

輸出結(jié)果如下,可以看到通過apply方法,我們也成功增加了一列性能:

                  產(chǎn)品經(jīng)理  產(chǎn)品類別  地區(qū) 安全等級(jí)  銷售額(元)  銷售數(shù)量  客戶評分  性能
出庫日期
2023-06-01       Jerry  電子產(chǎn)品  西南    C  3789.6    12   5.0  一般
2023-06-02        Cary    服裝  華東    A  2345.3    14   5.0   好
2023-06-03   Bob-Smith  家居用品  西北    D   567.8     7   3.7  一般

還可以順手通過value_counts()方法統(tǒng)計(jì)一下結(jié)果:

print(df["性能"].value_counts()) # 統(tǒng)計(jì)不同性能情況的個(gè)數(shù)

如果python基礎(chǔ)好的話,還可以通過推導(dǎo)式,簡化一下函數(shù)的寫法:

df["性能"] = df["安全等級(jí)"].apply(lambda x: "好" if x in ["A","B"] else "一般")

同時(shí)發(fā)現(xiàn)apply方法有一個(gè)axis參數(shù),表示傳入進(jìn)來的df是按行,還是按列,如果為1,代表為行,其實(shí)打印出來就發(fā)現(xiàn)

結(jié)構(gòu)其實(shí)是上面這樣子,因此可以通過df["XXXX"] 的形式取出來做判斷,然后再返回一個(gè)結(jié)果,如果axis=0,那代表的就是按列傳遞,其實(shí)每此傳遞都是 一列索引+一列數(shù)據(jù) 的格式,這種情況下我們可以對每列的數(shù)據(jù)做分析,結(jié)構(gòu)如下:

1.3 Assign方法

同時(shí)我們也可以使用Assign方法得到一樣的結(jié)果,下面不管是 map 還是多加的[ ],都是為了將數(shù)據(jù)一行一行取出來,具體mapapply 這些方法怎么用,我會(huì)在最后一節(jié),附錄中給出來

# 第一種寫法
df = df.assign(性能 = df["安全等級(jí)"].map(lambda x: "好" if x in ["A", "B"] else "一般"))
# 第二種寫法
df = df.assign(性能 = lambda x: ["好" if x in ["A", "B"] else "一般" for x in df["安全等級(jí)"]])
print(df.head(3))

因此我們可以得到結(jié)果是:

                 產(chǎn)品經(jīng)理  產(chǎn)品類別  地區(qū) 安全等級(jí)  銷售額(元)  銷售數(shù)量  客戶評分  性能
出庫日期
2023-06-01      Jerry  電子產(chǎn)品  西南    C  3789.6    12   5.0  一般
2023-06-02       Cary    服裝  華東    A  2345.3    14   5.0   好
2023-06-03  Bob-Smith  家居用品  西北    D   567.8     7   3.7  一般

1.3 通過條件語句進(jìn)行新增列

在下面的代碼中,我們先通過 df["性能"] = "" 初始化一個(gè)空列,然后依次賦值,可以得到一樣的結(jié)果:

df["性能"] = "" # 先初始化一個(gè)空列
df.loc[df["安全等級(jí)"].isin(["A","B"]),"性能"] = "好"
df.loc[df["安全等級(jí)"].isin(["C","D"]),"性能"] = "一般"
print(df.head(3))

二、pandas常見的數(shù)據(jù)統(tǒng)計(jì)類型

2.1 數(shù)據(jù)特征統(tǒng)計(jì)

pandas提供了非常強(qiáng)大的數(shù)據(jù)統(tǒng)計(jì)功能,比如去重,計(jì)數(shù)以及對數(shù)據(jù)特征做匯總,比如我們先簡單使用這樣一句代碼:

print(df.describe()) # 描述性統(tǒng)計(jì)

描述性統(tǒng)計(jì)用于數(shù)據(jù)中的數(shù)值列計(jì)數(shù),求平均值,標(biāo)準(zhǔn)差,最小最大值和各個(gè)分位數(shù)

       銷售額(元)     銷售數(shù)量      客戶評分
count   606.000000  606.000000  606.000000
mean   1381.760479    7.120462    4.327723
std     868.101509    3.309942    0.390114
min     345.600000    2.000000    3.500000
25%     745.600000    5.000000    4.000000
50%     987.600000    6.000000    4.300000
75%    1876.400000    8.000000    4.600000
max    4567.900000   21.000000    5.000000

當(dāng)然如果你只想要查看某個(gè)字段的具體指標(biāo)的話,可以通過單獨(dú)打印實(shí)現(xiàn):

print(df["銷售額(元)"].max()) # 最大銷售額
print(df["銷售額(元)"].min()) # 最小銷售額
print(df["銷售額(元)"].mean()) # 平均銷售額
print(df["銷售額(元)"].median()) # 中位數(shù)銷售額

print(df[["銷售額(元)","銷售數(shù)量"]].cov()) # 協(xié)方差矩陣
print(df[["銷售額(元)","銷售數(shù)量"]].corr()) # 相關(guān)系數(shù)矩陣

2.2 數(shù)據(jù)去重和分類匯總

通過 unique方法 我們能拿到去重之后的結(jié)果,返回的是一個(gè)列表,而通過 value_counts 我們能拿到各個(gè)子類的結(jié)果

print(df["安全等級(jí)"].unique())
print(df["安全等級(jí)"].value_counts())
print("="*60) # 分割線
print(df["地區(qū)"].unique())
print(df["地區(qū)"].value_counts())

輸出的結(jié)果如下:

['C' 'A' 'D' 'B']
安全等級(jí)
C    175
A    147
B    146
D    138
Name: count, dtype: int64
============================================================
['西南' '華東' '西北' '華北' '華南' '華中']
地區(qū)
華東    102
西南    101
華北    101
華南    101
華中    101
西北    100
Name: count, dtype: int64

三、pandas對缺失值的處理

我們有一個(gè)這樣的EXCEL文件,名為 DATA_part.xlsx,如圖所示,這個(gè)數(shù)據(jù)很不規(guī)范,有以下幾個(gè)典型特征:

  • A1單元格為空,真正的數(shù)值前有空行空列
  • 存在合并單元格
  • 數(shù)據(jù)源中也存在空行

3.1 判斷是否為空值

首先我們讀取這個(gè)EXCEL,使用skiprows 跳過第一行

file_path = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)DATA_part.xlsx"
df = pd.read_excel(file_path,skiprows=1) # 跳過第一行

得到如下的結(jié)果,可以發(fā)現(xiàn)沒有填充數(shù)據(jù)的部分都是NaN,因此我們需要對數(shù)據(jù)進(jìn)行清洗

   Unnamed: 0       產(chǎn)品經(jīng)理   地區(qū)  銷售數(shù)量  客戶評分
0         NaN      Jerry   西南  12.0   5.0
1         NaN        NaN   華東  14.0   5.0
2         NaN        NaN   西北   7.0   3.7
3         NaN        NaN  NaN   NaN   NaN
4         NaN       Cary   西南  17.0   NaN
5         NaN        NaN   華東  19.0  10.0
6         NaN        NaN   西北  12.0   8.7
7         NaN  Bob-Smith   西南  15.0   8.0
8         NaN        NaN   華東  17.0   8.0
9         NaN        NaN   西北  10.0   6.7

首先我們通過isnull來判斷是否是空值,注意兩層sum才是對整個(gè)區(qū)域的缺失值求和

print(df.isnull()) # 打印缺失值
print("="*60) # 分割線
print(df.isnull().sum()) # 查看缺失值數(shù)量
print("="*60) # 分割線
print(df.isnull().sum().sum()) # 查看缺失值總數(shù)

得到如下結(jié)果:

   Unnamed: 0   產(chǎn)品經(jīng)理     地區(qū)   銷售數(shù)量   客戶評分
0        True  False  False  False  False
1        True   True  False  False  False
2        True   True  False  False  False
3        True   True   True   True   True
4        True  False  False  False   True
5        True   True  False  False  False
6        True   True  False  False  False
============================================================
Unnamed: 0    7
產(chǎn)品經(jīng)理          5
地區(qū)            1
銷售數(shù)量          1
客戶評分          2
dtype: int64
============================================================
16

同樣如果我們需要統(tǒng)計(jì)非空值,那就使用notnull方法。

3.2 丟棄空行空列

在這里我們需要使用dropna方法,里面主要有三個(gè)參數(shù):

  • axis=1 , 代表按列方向,axis=0 , 代表按行方向
  • how="all" 代表這個(gè)維度所有的為空才刪除,how="any"代表只要有空值就刪除
  • inplace=True 代表替換原來的DataFrame,否則不替換
df.dropna(axis=1,how="all",inplace=True) # 按列刪除缺失值
df.dropna(axis=0,how="all",inplace=True) # 按行刪除缺失值

執(zhí)行以上過程后,得到稍微干凈一點(diǎn)的數(shù)據(jù):

    產(chǎn)品經(jīng)理  地區(qū)  銷售數(shù)量  客戶評分
0  Jerry  西南  12.0   5.0
1    NaN  華東  14.0   5.0
2    NaN  西北   7.0   3.7
4   Cary  西南  17.0   NaN
5    NaN  華東  19.0  10.0
6    NaN  西北  12.0   8.7

3.3 空值填充

接下來我們就需要對剩余的空值進(jìn)行處理,規(guī)范的DataFrame其實(shí)就是行和列每個(gè)位置都有有效的數(shù)據(jù),因此我們通過fillna方法將其進(jìn)行填充,其重要的主要有3個(gè)參數(shù):

  • value , 代表你要將空值填為什么,比如對于客戶評分列就很適合這種填充
  • method="ffill" 代表用空值之前的內(nèi)容填充,比如產(chǎn)品經(jīng)理列就很適合,同樣bfill代表用空值后續(xù)的值填充
  • inplace=True 代表替換原來的DataFrame,否則不替換
df["客戶評分"].fillna(value=0,inplace=True) # 填充缺失值
df["產(chǎn)品經(jīng)理"].fillna(method="ffill",inplace=True) # 填充缺失值

經(jīng)過這樣處理之后,得到的結(jié)果為:

    產(chǎn)品經(jīng)理  地區(qū)  銷售數(shù)量  客戶評分
0  Jerry  西南  12.0   5.0
1  Jerry  華東  14.0   5.0
2  Jerry  西北   7.0   3.7
4   Cary  西南  17.0   0.0
5   Cary  華東  19.0  10.0
6   Cary  西北  12.0   8.7

這樣子我們再直接寫到另一個(gè)工作簿,就非常完美了,但是要注意使用index=False,防止將DataFrame的索引列也寫回。

df.to_excel(r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)DATA_part_clean.xlsx",index=False) # 保存到新文件

我們打開保存之后的DATA_part_clean.xlsx文件,就發(fā)現(xiàn)清洗后的數(shù)據(jù)已經(jīng)放在表格內(nèi)了

附錄:Apply,Map,ApplyMap的使用差異

在下面的案例中,我們需要將 "A":"區(qū)域A","B":"區(qū)域B","C":"區(qū)域C" 做一個(gè)一一替換,使用了四種不同的方式,都能得到最后的結(jié)果:

  • apply 方法,結(jié)合lambda函數(shù),取出字典中的值,然后寫回
  • applymap 方法,遍歷整個(gè)DataFrame,發(fā)現(xiàn)有符合的鍵,則進(jìn)行相應(yīng)的值替換,但是需要注意此方法只適用于DataFrame
  • map 方法,既可以支持DataFrame 又可以支持Series
  • replace 方法,取出對應(yīng)的列索引,然后進(jìn)行字典替換
import pandas as pd
import numpy as np
import random

np.random.seed(42) # 固定隨機(jī)數(shù)種子
random.seed(42)
df = pd.DataFrame({
    "name":np.random.choice(["John","Doe","Jane"],20),
    "area":np.random.choice(["A","B","C"],20),
    "spend":np.random.randint(18,60,20),
    "perf":np.random.randint(1,100,20)
})
print(df.head(3))
print("="*30)
map_dict = {"A":"區(qū)域A","B":"區(qū)域B","C":"區(qū)域C"}
df["area"] = df["area"].apply(lambda x:map_dict[x]) # 采用apply方法進(jìn)行替換
df = df.applymap(lambda x:map_dict[x] if x in map_dict else x) # 使用applymap方法進(jìn)行替換
# df["area"] = df["area"].applymap(lambda x:map_dict[x]) # 這樣寫是錯(cuò)的,applymap只能對DataFrame生效
df["area"] = df["area"].map(map_dict)  # 使用map方法進(jìn)行替換,對Series進(jìn)行替換
df = df.map(lambda x:map_dict[x] if x in map_dict else x) # 對整個(gè)DataFrame進(jìn)行替換
df = df.replace({"area":map_dict}) # 采用replace方法替換area列的A、B、C
print(df.head(3))

上述幾種方法得到的結(jié)果都是,實(shí)現(xiàn)了對指定列的替換:

   name area  spend  perf
0  Jane    A     54    50
1  John    A     24     4
2  Jane    B     38     2
==============================
   name area  spend  perf
0  Jane  區(qū)域A     54    50
1  John  區(qū)域A     24     4
2  Jane  區(qū)域B     38     2

到此這篇關(guān)于一文帶你掌握Python Pandas數(shù)據(jù)處理的三大實(shí)用技巧的文章就介紹到這了,更多相關(guān)Python Pandas數(shù)據(jù)處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

喀喇沁旗| 石台县| 大厂| 定兴县| 南岸区| 麻城市| 伊金霍洛旗| 拉萨市| 恭城| 万宁市| 梁平县| 阳朔县| 仁寿县| 固镇县| 西乡县| 台北县| 永川市| 阿鲁科尔沁旗| 罗平县| 广丰县| 永胜县| 涞源县| 砀山县| 饶平县| 城市| 临颍县| 平凉市| 长治县| 政和县| 黄冈市| 镇远县| 鄯善县| 安陆市| 紫阳县| 阿图什市| 崇明县| 崇义县| 武冈市| 马尔康县| 柳河县| 朝阳县|