Python Pandas 處理空數據/缺失數據 dropna fillna,增加/更新列 assign,分層 qcut,向量函數

數據準備

import pandas as pd
import numpy as np
# 假設有 5 個人,分別參加了 4 門課程,獲得了對應的分數
# 同時這個 5 個人分別負責的項目個數 在 'Project_num' 列中顯示
data = {'name' : pd.Series(['Alice', 'Bob', 'Cathy', 'Dany', 'Ella', 'Ford', 'Gary', 'Ham', 'Ico', 'Jack']),
        'Math_A' : pd.Series([1.1, 2.2, 3.3, 4.4, 5, 3.2, 2.4, 1.5, 4.3]),
        'English_A' : pd.Series([3, 2.6, 2, 1.7, 3, 3.3, 4.4, 5, 3.2, 2.4]),
        'Math_B' : pd.Series([1.7, 2.5, 3.6, 2.4, 5, 2.2, 3.3, 4.4, 1.5, 4.3]),
        'English_B' : pd.Series([5, 2.6, 2.4, 1.3, 3, 3.6, 2.4, 5, 2.2]),
        'Project_num' : pd.Series([2, 3, 0, 1, 7, 2, 1, 5, 3, 4]),
        'Sex' : pd.Series(['F', 'M', 'M', 'F', 'M', 'F', 'M', 'M', 'F', 'M'])
     }
df = pd.DataFrame(data)
print(df)

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex
0  Alice     1.1        3.0     1.7        5.0            2   F
1    Bob     2.2        2.6     2.5        2.6            3   M
2  Cathy     3.3        2.0     3.6        2.4            0   M
3   Dany     4.4        1.7     2.4        1.3            1   F
4   Ella     5.0        3.0     5.0        3.0            7   M
5   Ford     3.2        3.3     2.2        3.6            2   F
6   Gary     2.4        4.4     3.3        2.4            1   M
7    Ham     1.5        5.0     4.4        5.0            5   M
8    Ico     4.3        3.2     1.5        2.2            3   F
9   Jack     NaN        2.4     4.3        NaN            4   M

一、處理缺失數據

1.1 去除有缺失數據的行 dropna

print(df.dropna())
# 由於 Jack 的數據有 缺失,所以刪除這一行
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex
0  Alice     1.1        3.0     1.7        5.0            2   F
1    Bob     2.2        2.6     2.5        2.6            3   M
2  Cathy     3.3        2.0     3.6        2.4            0   M
3   Dany     4.4        1.7     2.4        1.3            1   F
4   Ella     5.0        3.0     5.0        3.0            7   M
5   Ford     3.2        3.3     2.2        3.6            2   F
6   Gary     2.4        4.4     3.3        2.4            1   M
7    Ham     1.5        5.0     4.4        5.0            5   M
8    Ico     4.3        3.2     1.5        2.2            3   F

1.2 替換缺失數據 fillna

print(df.fillna(0))
# 將 Jack 的空缺數據,用 0 補上
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex
0  Alice     1.1        3.0     1.7        5.0            2   F
1    Bob     2.2        2.6     2.5        2.6            3   M
2  Cathy     3.3        2.0     3.6        2.4            0   M
3   Dany     4.4        1.7     2.4        1.3            1   F
4   Ella     5.0        3.0     5.0        3.0            7   M
5   Ford     3.2        3.3     2.2        3.6            2   F
6   Gary     2.4        4.4     3.3        2.4            1   M
7    Ham     1.5        5.0     4.4        5.0            5   M
8    Ico     4.3        3.2     1.5        2.2            3   F
9   Jack     0.0        2.4     4.3        0.0            4   M

二、增加/更新列

2.1 指定生成列的方式

df_2 = df.assign(Chinese_A=np.random.randint(1,5,size=10))
print(df_2)
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex  Chinese_A
0  Alice     1.1        3.0     1.7        5.0            2   F          2
1    Bob     2.2        2.6     2.5        2.6            3   M          2
2  Cathy     3.3        2.0     3.6        2.4            0   M          2
3   Dany     4.4        1.7     2.4        1.3            1   F          4
4   Ella     5.0        3.0     5.0        3.0            7   M          2
5   Ford     3.2        3.3     2.2        3.6            2   F          4
6   Gary     2.4        4.4     3.3        2.4            1   M          2
7    Ham     1.5        5.0     4.4        5.0            5   M          2
8    Ico     4.3        3.2     1.5        2.2            3   F          2
9   Jack     NaN        2.4     4.3        NaN            4   M          1

2.2 複製現有的列生成新的列

df_2 = df.assign(Chinese_A=df.English_A)
print(df_2)
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex  Chinese_A
0  Alice     1.1        3.0     1.7        5.0            2   F        3.0
1    Bob     2.2        2.6     2.5        2.6            3   M        2.6
2  Cathy     3.3        2.0     3.6        2.4            0   M        2.0
3   Dany     4.4        1.7     2.4        1.3            1   F        1.7
4   Ella     5.0        3.0     5.0        3.0            7   M        3.0
5   Ford     3.2        3.3     2.2        3.6            2   F        3.3
6   Gary     2.4        4.4     3.3        2.4            1   M        4.4
7    Ham     1.5        5.0     4.4        5.0            5   M        5.0
8    Ico     4.3        3.2     1.5        2.2            3   F        3.2
9   Jack     NaN        2.4     4.3        NaN            4   M        2.4

2.3 利用現有的列數據,按照函數生成新的列

2.3.1 方式一

df_2 = df.assign(Math_Total=lambda x:x['Math_A']+x['Math_B'])
# 計算 Math_A 和 Math_B 的加總分數
print(df_2)
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex  Math_Total
0  Alice     1.1        3.0     1.7        5.0            2   F         2.8
1    Bob     2.2        2.6     2.5        2.6            3   M         4.7
2  Cathy     3.3        2.0     3.6        2.4            0   M         6.9
3   Dany     4.4        1.7     2.4        1.3            1   F         6.8
4   Ella     5.0        3.0     5.0        3.0            7   M        10.0
5   Ford     3.2        3.3     2.2        3.6            2   F         5.4
6   Gary     2.4        4.4     3.3        2.4            1   M         5.7
7    Ham     1.5        5.0     4.4        5.0            5   M         5.9
8    Ico     4.3        3.2     1.5        2.2            3   F         5.8
9   Jack     NaN        2.4     4.3        NaN            4   M         NaN

2.3.2 方式二

df_3 = df.assign(English_Total=lambda df:df['English_A']+df['English_B'])
# 計算 English_A 和 English_B 的加總分數
print(df_3)
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex  English_Total
0  Alice     1.1        3.0     1.7        5.0            2   F            8.0
1    Bob     2.2        2.6     2.5        2.6            3   M            5.2
2  Cathy     3.3        2.0     3.6        2.4            0   M            4.4
3   Dany     4.4        1.7     2.4        1.3            1   F            3.0
4   Ella     5.0        3.0     5.0        3.0            7   M            6.0
5   Ford     3.2        3.3     2.2        3.6            2   F            6.9
6   Gary     2.4        4.4     3.3        2.4            1   M            6.8
7    Ham     1.5        5.0     4.4        5.0            5   M           10.0
8    Ico     4.3        3.2     1.5        2.2            3   F            5.4
9   Jack     NaN        2.4     4.3        NaN            4   M            NaN

2.3.3 方式三

df_4 = df.assign(Total = df_2.Math_Total + df_3.English_Total)
# 將計算總分 Total
print(df_4)
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex  Total
0  Alice     1.1        3.0     1.7        5.0            2   F   10.8
1    Bob     2.2        2.6     2.5        2.6            3   M    9.9
2  Cathy     3.3        2.0     3.6        2.4            0   M   11.3
3   Dany     4.4        1.7     2.4        1.3            1   F    9.8
4   Ella     5.0        3.0     5.0        3.0            7   M   16.0
5   Ford     3.2        3.3     2.2        3.6            2   F   12.3
6   Gary     2.4        4.4     3.3        2.4            1   M   12.5
7    Ham     1.5        5.0     4.4        5.0            5   M   15.9
8    Ico     4.3        3.2     1.5        2.2            3   F   11.2
9   Jack     NaN        2.4     4.3        NaN            4   M    NaN

2.4 對現有列數據進行更新

df_5 = df_4.assign(Total = lambda df : df.Total*2)
# 將總分翻倍
print(df_5)
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex  Total
0  Alice     1.1        3.0     1.7        5.0            2   F   21.6
1    Bob     2.2        2.6     2.5        2.6            3   M   19.8
2  Cathy     3.3        2.0     3.6        2.4            0   M   22.6
3   Dany     4.4        1.7     2.4        1.3            1   F   19.6
4   Ella     5.0        3.0     5.0        3.0            7   M   32.0
5   Ford     3.2        3.3     2.2        3.6            2   F   24.6
6   Gary     2.4        4.4     3.3        2.4            1   M   25.0
7    Ham     1.5        5.0     4.4        5.0            5   M   31.8
8    Ico     4.3        3.2     1.5        2.2            3   F   22.4
9   Jack     NaN        2.4     4.3        NaN            4   M    NaN

三、分層 pd.qcut

3.1 方式一

print(pd.qcut(df.Math_A,[0,0.5,1],labels=['低分','高分']))
# 分 2 層,各一半
print('\n')

運行結果:

0     低分
1     低分
2     高分
3     高分
4     高分
5     低分
6     低分
7     低分
8     高分
9    NaN
Name: Math_A, dtype: category
Categories (2, object): [低分 < 高分]

3.2 方式二

print(pd.qcut(df.Math_A,[0,0.2,0.8,1],labels=['低分','中等','高分']))
# 分 3 層,第一層佔 20%,第二次 60%,第三層 20%
print('\n')

運行結果:

0     低分
1     中等
2     中等
3     高分
4     高分
5     中等
6     中等
7     低分
8     中等
9    NaN
Name: Math_A, dtype: category
Categories (3, object): [低分 < 中等 < 高分]

3.3 方式三

print(pd.qcut(df.Math_A,3,labels=['低分','中等','高分']))
# 默認方式分 3 層
print('\n')

運行結果:

0     低分
1     低分
2     中等
3     高分
4     高分
5     中等
6     中等
7     低分
8     高分
9    NaN
Name: Math_A, dtype: category
Categories (3, object): [低分 < 中等 < 高分]

四、向量函數 max,min,clip,abs

4.1 縱向/列取最大值 df.max

print(df.max())
# 縱向取最大值
print('\n')

運行結果:

name           Jack
Math_A            5
English_A         5
Math_B            5
English_B         5
Project_num       7
Sex               M
dtype: object

4.2 橫向/行取最大值

print(df.max(axis=1))
# 橫取最大值
print('\n')

運行結果:

0    5.0
1    3.0
2    3.6
3    4.4
4    7.0
5    3.6
6    4.4
7    5.0
8    4.3
9    4.3
dtype: float64

4.3 修剪/設定截取區間 clip

print(df.Math_A.clip(lower = 1, upper = 2))
# 將 Math_A 設定在 1~2 之間
print('\n')

運行結果:

0    1.1
1    2.0
2    2.0
3    2.0
4    2.0
5    2.0
6    2.0
7    1.5
8    2.0
9    NaN
Name: Math_A, dtype: float64

4.4 取絕對值 abs

df_6 = df.assign(Test=df.Math_A-2)
print(df_6)
print('\n')
print(df_6.Test.abs())
print('\n')

運行結果:

    name  Math_A  English_A  Math_B  English_B  Project_num Sex  Test
0  Alice     1.1        3.0     1.7        5.0            2   F  -0.9
1    Bob     2.2        2.6     2.5        2.6            3   M   0.2
2  Cathy     3.3        2.0     3.6        2.4            0   M   1.3
3   Dany     4.4        1.7     2.4        1.3            1   F   2.4
4   Ella     5.0        3.0     5.0        3.0            7   M   3.0
5   Ford     3.2        3.3     2.2        3.6            2   F   1.2
6   Gary     2.4        4.4     3.3        2.4            1   M   0.4
7    Ham     1.5        5.0     4.4        5.0            5   M  -0.5
8    Ico     4.3        3.2     1.5        2.2            3   F   2.3
9   Jack     NaN        2.4     4.3        NaN            4   M   NaN


0    0.9
1    0.2
2    1.3
3    2.4
4    3.0
5    1.2
6    0.4
7    0.5
8    2.3
9    NaN
Name: Test, dtype: float64
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章