Python Pandas - ไม่มีข้อมูล
ข้อมูลที่ขาดหายไปมักเป็นปัญหาในชีวิตจริง พื้นที่ต่างๆเช่นการเรียนรู้ของเครื่องและการขุดข้อมูลต้องเผชิญกับปัญหาที่รุนแรงในด้านความแม่นยำของการคาดคะเนแบบจำลองเนื่องจากข้อมูลมีคุณภาพต่ำซึ่งเกิดจากค่าที่ขาดหายไป ในพื้นที่เหล่านี้การรักษามูลค่าที่ขาดหายไปเป็นจุดสำคัญในการทำให้แบบจำลองมีความแม่นยำและถูกต้องมากขึ้น
เมื่อใดและเหตุใดจึงไม่มีข้อมูล
ให้เราพิจารณาแบบสำรวจออนไลน์สำหรับผลิตภัณฑ์ หลายครั้งผู้คนไม่เปิดเผยข้อมูลทั้งหมดที่เกี่ยวข้องกับพวกเขา มีคนเพียงไม่กี่คนที่แบ่งปันประสบการณ์ของพวกเขา แต่ใช้ผลิตภัณฑ์ไม่นานเท่าไหร่ มีเพียงไม่กี่คนที่แบ่งปันระยะเวลาที่ใช้ผลิตภัณฑ์ประสบการณ์ของพวกเขา แต่ไม่ใช่ข้อมูลติดต่อของพวกเขา ดังนั้นในบางกรณีหรืออีกวิธีหนึ่งข้อมูลส่วนหนึ่งมักจะหายไปและเป็นเรื่องปกติมากในเวลาจริง
มาดูกันว่าเราจะจัดการกับค่าที่ขาดหายไปได้อย่างไร (พูดว่า NA หรือ NaN) โดยใช้ Pandas
# import the pandas library
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df
มัน output มีดังนี้ -
one two three
a 0.077988 0.476149 0.965836
b NaN NaN NaN
c -0.390208 -0.551605 -2.301950
d NaN NaN NaN
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g NaN NaN NaN
h 0.085100 0.532791 0.887415
เราได้สร้าง DataFrame โดยใช้การทำดัชนีใหม่โดยใช้ค่าที่ขาดหายไป ในผลลัพธ์NaN หมายถึง Not a Number.
ตรวจสอบค่าที่หายไป
เพื่อให้การตรวจจับค่าที่หายไปง่ายขึ้น (และข้ามประเภทอาร์เรย์ต่างๆ) Pandas จัดเตรียมไฟล์ isnull() และ notnull() ฟังก์ชันซึ่งเป็นวิธีการบนวัตถุ Series และ DataFrame ด้วย -
ตัวอย่าง 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].isnull()
มัน output มีดังนี้ -
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
ตัวอย่าง 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].notnull()
มัน output มีดังนี้ -
a True
b False
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
การคำนวณที่ไม่มีข้อมูล
- เมื่อรวมข้อมูล NA จะถือว่าเป็นศูนย์
- หากข้อมูลเป็น NA ทั้งหมดผลลัพธ์จะเป็น NA
ตัวอย่าง 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].sum()
มัน output มีดังนี้ -
2.02357685917
ตัวอย่าง 2
import pandas as pd
import numpy as np
df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()
มัน output มีดังนี้ -
nan
การทำความสะอาด / การกรอกข้อมูลที่ขาดหายไป
นุ่นจัดเตรียมวิธีการต่างๆในการทำความสะอาดค่าที่หายไป ฟังก์ชัน Fillna สามารถ "กรอก" ค่า NA ด้วยข้อมูลที่ไม่ใช่ค่าว่างได้สองวิธีซึ่งเราได้แสดงไว้ในส่วนต่อไปนี้
แทนที่ NaN ด้วยค่าสเกลาร์
โปรแกรมต่อไปนี้จะแสดงวิธีแทนที่ "NaN" ด้วย "0"
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print df
print ("NaN replaced with '0':")
print df.fillna(0)
มัน output มีดังนี้ -
one two three
a -0.576991 -0.741695 0.553172
b NaN NaN NaN
c 0.744328 -1.735166 1.749580
NaN replaced with '0':
one two three
a -0.576991 -0.741695 0.553172
b 0.000000 0.000000 0.000000
c 0.744328 -1.735166 1.749580
ที่นี่เรากำลังเติมค่าด้วยศูนย์ เราสามารถเติมค่าอื่น ๆ แทนได้
กรอก NA ไปข้างหน้าและข้างหลัง
การใช้แนวคิดการเติมที่กล่าวถึงในบท ReIndexing เราจะเติมเต็มค่าที่ขาดหายไป
ซีเนียร์ No | วิธีการและการดำเนินการ |
---|---|
1 | pad/fill วิธีการกรอกไปข้างหน้า |
2 | bfill/backfill วิธีเติมย้อนหลัง |
ตัวอย่าง 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='pad')
มัน output มีดังนี้ -
one two three
a 0.077988 0.476149 0.965836
b 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
d -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
ตัวอย่าง 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='backfill')
มัน output มีดังนี้ -
one two three
a 0.077988 0.476149 0.965836
b -0.390208 -0.551605 -2.301950
c -0.390208 -0.551605 -2.301950
d -2.000303 -0.788201 1.510072
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g 0.085100 0.532791 0.887415
h 0.085100 0.532791 0.887415
ปล่อยค่าที่ขาดหายไป
หากคุณต้องการยกเว้นค่าที่ขาดหายไปให้ใช้ไฟล์ dropna ฟังก์ชั่นพร้อมกับ axisการโต้เถียง. ตามค่าเริ่มต้นแกน = 0 คือตามแถวซึ่งหมายความว่าหากค่าใด ๆ ภายในแถวเป็น NA จะไม่รวมทั้งแถว
ตัวอย่าง 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()
มัน output มีดังนี้ -
one two three
a 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
ตัวอย่าง 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna(axis=1)
มัน output มีดังนี้ -
Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]
แทนที่ค่าทั่วไปที่ขาดหายไป (หรือ)
หลายครั้งเราต้องแทนที่ค่าทั่วไปด้วยค่าเฉพาะบางค่า เราสามารถบรรลุสิ่งนี้ได้โดยใช้วิธีการแทนที่
การแทนที่ NA ด้วยค่าสเกลาร์เป็นลักษณะการทำงานที่เทียบเท่ากันของ fillna() ฟังก์ชัน
ตัวอย่าง 1
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
มัน output มีดังนี้ -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
ตัวอย่าง 2
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
มัน output มีดังนี้ -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60