如何在Pandas数据帧的列中用Zero替换所有NaN值

Geo*_*son 393 python dataframe pandas

我有一个数据框如下

      itm Date                  Amount 
67    420 2012-09-30 00:00:00   65211
68    421 2012-09-09 00:00:00   29424
69    421 2012-09-16 00:00:00   29877
70    421 2012-09-23 00:00:00   30990
71    421 2012-09-30 00:00:00   61303
72    485 2012-09-09 00:00:00   71781
73    485 2012-09-16 00:00:00     NaN
74    485 2012-09-23 00:00:00   11072
75    485 2012-09-30 00:00:00  113702
76    489 2012-09-09 00:00:00   64731
77    489 2012-09-16 00:00:00     NaN
Run Code Online (Sandbox Code Playgroud)

当我尝试将一个函数应用于Amount列时,我得到以下错误.

ValueError: cannot convert float NaN to integer
Run Code Online (Sandbox Code Playgroud)

我尝试使用数学模块中的.isnan应用函数我已经尝试过pandas .replace属性我尝试了pandas 0.9中的.sparse数据属性我也尝试过函数中的NaN == NaN语句.我也看过这篇文章如何在R数据帧中用零替换NA值?同时看一些其他文章.我尝试的所有方法都没有工作或者没有认识到NaN.任何提示或解决方案将不胜感激.

Ama*_*man 664

我相信DataFrame.fillna()会为你做这件事.

链接到数据框系列的文档.

例:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000
Run Code Online (Sandbox Code Playgroud)

要仅在一列中填充NaN,请仅选择该列.在这种情况下,我使用inplace = True来实际更改df的内容.

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000
Run Code Online (Sandbox Code Playgroud)


小智 98

切片无法保证返回视图或副本.你可以做

df['column'] = df['column'].fillna(value)
Run Code Online (Sandbox Code Playgroud)

  • 刚刚发现了"inplace = True"问题.这个答案避免了这个问题,我认为这是最清晰的解决方案. (10认同)

Ant*_*pov 30

您可以使用replace更改NaN0:

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)
Run Code Online (Sandbox Code Playgroud)


Eze*_*ick 21

我只是想提供一些更新/特殊情况,因为看起来人们仍然来到这里.如果您正在使用多索引或使用索引切片器,则inplace = True选项可能不足以更新您选择的切片.例如,在2x2级别的多索引中,这不会更改任何值(从pandas 0.15开始):

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)
Run Code Online (Sandbox Code Playgroud)

"问题"是链接打破了fillna更新原始数据帧的能力.我把"问题"放在引号中,因为设计决策有充分的理由导致在某些情况下不通过这些链解释.此外,这是一个复杂的例子(虽然我真的遇到过它),但同样可能适用于较少级别的索引,具体取决于您的切片方式.

解决方案是DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))
Run Code Online (Sandbox Code Playgroud)

它是一行,读取得相当好(有点)并且消除了任何不必要的中间变量或循环的混乱,同时允许您将fillna应用于您喜欢的任何多级切片!

如果任何人都可以找到不起作用的地方请在评论中发帖,我一直在搞乱它并查看源代码,它似乎至少解决了我的多索引切片问题.


小智 20

以下代码对我有用.

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)
Run Code Online (Sandbox Code Playgroud)


Far*_*izy 8

您还可以使用字典来填充 DataFrame 中特定列的 NaN 值,而不是用某个 oneValue 填充所有 DF。

import pandas as pd

df = pd.read_excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)
Run Code Online (Sandbox Code Playgroud)


Viv*_*han 7

替换 pandas 中的 na 值

df['column_name'].fillna(value_to_be_replaced,inplace=True)
Run Code Online (Sandbox Code Playgroud)

if inplace = False,它将返回修改后的值,而不是更新 df (数据帧)。


Bha*_*aja 6

在此输入图像描述

考虑到上表中的特定列Amount是整数类型。以下是一个解决方案:

df['Amount'] = df.Amount.fillna(0).astype(int)
Run Code Online (Sandbox Code Playgroud)

同样,您可以用各种数据类型填充它floatstr例如,等等。

特别是,我会考虑使用数据类型来比较同一列的各个值。


小智 5

填充缺失值的简单方法:

填充 字符串列:当字符串列具有缺失值和NaN值时。

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)
Run Code Online (Sandbox Code Playgroud)

填充 数字列:当数字列缺少值和NaN值时。

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)
Run Code Online (Sandbox Code Playgroud)

用零填充NaN:

df['column name'].fillna(0, inplace = True)
Run Code Online (Sandbox Code Playgroud)


小智 5

用不同的方式替换不同列中的 nan:

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
Run Code Online (Sandbox Code Playgroud)


Ank*_*ira 5

这对我有用,但没有人提到它。难道是有什么问题吗?

df.loc[df['column_name'].isnull(), 'column_name'] = 0
Run Code Online (Sandbox Code Playgroud)