如何替換dataframe中的nan?

2021-10-02 07:45:11 字數 4083 閱讀 9771

在做資料清洗等工作時,必不可少的環節就是缺失值處理。在採用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...