在做資料清洗等工作時,必不可少的環節就是缺失值處理。在採用pandas讀取或處理資料時,dataframe的缺失值預設是用nan填充的。但大多數情況下,我們需要的是none或者null值而不是nan.所以,如何替換dataframe中的nan呢?
1.準備測試資料
types =
# 注意age不能指定為int型別,
# 指定型別讀取資料
data = pd.read_excel('../../test.xlsx', sheet_name='sheet1', header=0, dtype=types)
#檢視資料
print(data)
# 檢視每列的資料型別
print(data.dtypes)
注意:age列中含有缺失值,所以不能指定為int型,否則會報錯:valueerror: unable to convert column age to type
輸出結果:
name cost age phone
0 小青 nan 25.0 12341234123
1 小紅 1.628771e+06 23.0 12341234124
2 小明 8.438553e+05 26.0 12341234125
3 小李 1.699444e+06 25.0 12341234126
4 小王 2.635745e+06 nan 12341234127
5 小張 1.168142e+06 25.0 nan
6 小劉 1.607670e+06 28.0 12341234129
7 nan 1.234523e+04 27.0 nan
name object
cost float64
age float64
phone object
dtype: object
process finished with exit code 0
2.dataframe.fillna();該方法使用指定的方法填充na / nan值
values =
data.fillna(value=values,inplace=true)
print(data)
輸出結果:
name cost age phone
0 小青 0.000000e+00 25.0 12341234123
1 小紅 1.628771e+06 23.0 12341234124
2 小明 8.438553e+05 26.0 12341234125
3 小李 1.699444e+06 25.0 12341234126
4 小王 2.635745e+06 -1.0 12341234127
5 小張 1.168142e+06 25.0 nan
6 小劉 1.607670e+06 28.0 12341234129
7 nan 1.234523e+04 27.0 nan
process finished with exit code 0
從上面的輸出結果可以看出:fillna()方法必須要指定乙個填充且不為none的值,且object型別的填充並未生效
# 檢視資料
print(data)
輸出結果:
name cost age phone
0 小青 nan 25.0 12341234123
1 小紅 1.628771e+06 23.0 12341234124
2 小明 8.438553e+05 26.0 12341234125
3 小李 1.699444e+06 25.0 12341234126
4 小王 2.635745e+06 nan 12341234127
5 小張 1.168142e+06 25.0 none
6 小劉 1.607670e+06 28.0 12341234129
7 none 1.234523e+04 27.0 none
process finished with exit code 0
由上面的輸出結果可以看出:該方法只對字串型別的資料生效,數值型別的資料又不能起作用了
4.dataframe.where()篩選需要的資料,如果符合要求就返回原始值,如果不符合要求就用引數other的值填充,other的預設值為numpy.nan
4.1不指定資料型別
data = pd.read_excel('../../test.xlsx', sheet_name='sheet1', header=0)
data = data.where((data.notna()),none)
# 檢視資料
print(data)
輸出結果:
name cost age phone
0 小青 none 25 1.23412e+10
1 小紅 1.62877e+06 23 1.23412e+10
2 小明 843855 26 1.23412e+10
3 小李 1.69944e+06 25 1.23412e+10
4 小王 2.63574e+06 none 1.23412e+10
5 小張 1.16814e+06 25 none
6 小劉 1.60767e+06 28 1.23412e+10
7 none 12345.2 27 none
process finished with exit code 0
注意:上面**中使用where方法時,讀取測試資料並沒有指定name為str型別,
如果指定為str型別,則pandas讀取該列時缺失值採用字串'nan'進行填充,data.notna()返回的是true,如果不指定name列的型別,則該列的缺失值使用float型別的numpy.nan填充,data.notna()返回的是false。
4.2 指定資料型別,可自定的where方法的cond引數
types =
# 指定型別讀取資料
data = pd.read_excel('../../test.xlsx', sheet_name='sheet1', header=0, dtype=types)
# 檢視資料
print(data)
輸出結果:
name cost age phone
0 小青 none 25 12341234123
1 小紅 1.62877e+06 23 12341234124
2 小明 843855 26 12341234125
3 小李 1.69944e+06 25 12341234126
4 小王 2.63574e+06 none 12341234127
5 小張 1.16814e+06 25 none
6 小劉 1.60767e+06 28 12341234129
7 none 12345.2 27 none
DataFrame中apply的用法
函式應用和對映 import numpy as np import pandas as pd df pd.dataframe np.random.randn 4,3 columns list bde index utah ohio texas oregon print df b d e utah 0...
如何在DataFrame中通過索引高效獲取資料?
今天是pandas資料處理專題的第四篇文章,我們一起來聊聊dataframe中的索引。資料對齊 我們可以計算兩個dataframe的加和,pandas會自動將這兩個dataframe進行資料對齊,如果對不上的資料會被置為nan not a number 首先我們來建立兩個dataframe impo...
Python如何在DataFrame增加數值
這篇文章主要介紹程式設計客棧了python如何在dataframe增加數值,文中通過示例 介紹的非常詳細,對www.cppcns.com大www.cppcns.com家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下 生成乙個 syyqphdyizdataframe import pand...