iT邦幫忙

1

dataFrame技巧九式- 刪

dataFrame技巧總介紹-
python之pandas模組dataFrame九大技巧總覽- 增刪查改讀寫切併排

定義: 在既有的dataFrame上,刪除一列(row)或一行(column)資料,
或一次性刪除多列或多行資料

資料準備- 隨機創建資料表

我們先用隨機生成的資料表供練習,
比如說:

import random
import pandas as pd

def random_str(length=3):
    return ''.join([chr(ord('a')+random.randrange(26)) for _ in range(length)])

def random_df(num):
    department = ['A','B','C']
    data = {"student_id":[random.randint(10000,20000) for _ in range(num)],
            "student_name":[random_str() for _ in range(num)],
             "department":[random.choice(department) for _ in range(num)]}
    return pd.DataFrame.from_dict(data)

random.seed(30) #為了確保每次執行程式生成的資料相同,此設固定的random seed
df1 = random_df(5) 
print("原始資料:")
print(df1)

結果:

原始資料:
   student_id student_name department
0       18832          bmm          B
1       14738          uec          C
2       10492          oaq          B
3       13440          hac          C
4       14215          ftq          A

主要函式drop介紹

刪除panda的資料主要會用到drop函數,
格式大概如:Dataframe.drop(label, axis, inplace)

  • label是一個list,放入要刪除的欄位名稱,
  • axis指定要刪除行(column)還是列(row),0:列、1:行
  • inplace則控制要原地修改dataframe還是要回傳一個複製的dataframe

舉兩個例子說明:
<刪除多行>

df1.drop(['student_id', 'department'], axis=1, inplace=True)
print("修改後資料:")
print(df1)

結果:

修改後資料:
  student_name
0          bmm
1          uec
2          oaq
3          hac
4          ftq

<刪除多列>

df1.drop([0,1,3], axis=0, inplace=True)
print("修改後資料:")
print(df1)

結果:

修改後資料:
   student_id student_name department
2       10492          oaq          B
4       14215          ftq          A

缺失資料處理- dropna

參考:

  1. pandas.DataFrame.dropna
  2. Pandas中缺失值的相关概念与处理方法总结

另有一個實用的情境是,
有時候資料表裡面不一定每一格都有值,
有時資料表裡面會有許多缺失的資料,
如果資料缺很多,我們可能就會想把它刪除

pandas裡大致上分三種缺失符號:

  1. np.nan (not a number)
  2. None
  3. pd.NaT (not a time)

資料準備

為了模擬資料表缺失資料的情況,
我們修改程式,讓隨機生成的資料表有機率生成np.nanNone的資料

範例:

import random
import pandas as pd
import numpy as np

def random_str(length=3, miss_rate = 0):
    assert 0 <= miss_rate <= 1, 'probability must in [0,1]'
    miss = random.choices(range(0,2), weights= [1-miss_rate, miss_rate])[0]
    return None if miss else ''.join([chr(ord('a')+random.randrange(26)) for _ in range(length)])

def random_num(low, high, miss_rate = 0):
    # miss_rate between 0,1
    assert 0 <= miss_rate <= 1, 'probability must in [0,1]'
    miss = random.choices(range(0,2), weights= [1-miss_rate, miss_rate])[0]
    return np.nan if miss else random.randint(low,high)
        
    print(miss)

def random_df(num):
    department = ['A','B','C', None]
    data = {"student_id":[random_num(10000,20000,0.3) for _ in range(num)],
            "student_name":[random_str(miss_rate = 0.3) for _ in range(num)],
             "department":[random.choice(department) for _ in range(num)]}
    return pd.DataFrame.from_dict(data)

random.seed(30) #為了確保每次執行程式生成的資料相同,此設固定的random seed
df1 = random_df(20) 
print("原始資料:")
print(df1)

結果:

原始資料:
    student_id student_name department
0      14738.0          jej          C
1      13440.0         None          C
2          NaN          ceh          A
3      16163.0          dya          B
4      11332.0          xqj          A
5      18558.0          ufp          C
6          NaN          qov          A
7      11190.0         None          C
8          NaN          cau       None
9          NaN         None          A
10         NaN          pip       None
11     16582.0          iwv          A
12         NaN          ffq          B
13     18768.0          vhg       None
14         NaN          nxt          C
15     14073.0          mvu          C
16         NaN         None       None
17     17025.0          zuw          B
18     14561.0          jqe          B
19     11830.0         None       None

這邊我們生成了二十名學生的資料表,
其中每個欄位都有一定的機率為缺失值

資料過濾的幾種方法

方法一、只要有資料缺失的列即刪除

df1.dropna(inplace = True)
print("過濾後資料:")
print(df1)

結果:

過濾後資料:
    student_id student_name department
0      14738.0          jej          C
3      16163.0          dya          B
4      11332.0          xqj          A
5      18558.0          ufp          C
11     16582.0          iwv          A
15     14073.0          mvu          C
17     17025.0          zuw          B
18     14561.0          jqe          B

方法二、該列的資料全部缺失才刪除

df1.dropna(how='all', inplace = True)
print("過濾後資料:")
print(df1)

結果:

過濾後資料:
    student_id student_name department
0      14738.0          jej          C
1      13440.0         None          C
2          NaN          ceh          A
3      16163.0          dya          B
4      11332.0          xqj          A
5      18558.0          ufp          C
6          NaN          qov          A
7      11190.0         None          C
8          NaN          cau       None
9          NaN         None          A
10         NaN          pip       None
11     16582.0          iwv          A
12         NaN          ffq          B
13     18768.0          vhg       None
14         NaN          nxt          C
15     14073.0          mvu          C
17     17025.0          zuw          B
18     14561.0          jqe          B
19     11830.0         None       None

方法三、thresh參數: 該列若有thresh個以上不是缺失值則保留

舉例來說,thresh=2保留表示至少2個欄位不是缺失值的列

df1.dropna(thresh=2, inplace = True)
print("過濾後資料:")
print(df1)

結果:

過濾後資料:
    student_id student_name department
0      14738.0          jej          C
1      13440.0         None          C
2          NaN          ceh          A
3      16163.0          dya          B
4      11332.0          xqj          A
5      18558.0          ufp          C
6          NaN          qov          A
7      11190.0         None          C
11     16582.0          iwv          A
12         NaN          ffq          B
13     18768.0          vhg       None
14         NaN          nxt          C
15     14073.0          mvu          C
17     17025.0          zuw          B
18     14561.0          jqe          B

尚未有邦友留言

立即登入留言