573

我有一个熊猫数据框如下:

      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

当我尝试将函数应用于 Amount 列时,出现以下错误:

ValueError: cannot convert float NaN to integer

我尝试使用数学模块中的 .isnan 应用函数 我尝试过 pandas .replace 属性 我尝试过 pandas 0.9 中的 .sparse 数据属性 我也尝试过 if NaN == NaN 函数中的语句。我还看过这篇文章如何在 R 数据框中用零替换 NA 值?在看其他一些文章的时候。我尝试过的所有方法都不起作用或无法识别 NaN。任何提示或解决方案将不胜感激。

4

16 回答 16

906

我相信DataFrame.fillna()会为你做到这一点。

链接到 Docs 以获取dataframeSeries

例子:

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

要仅将 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

编辑:

为避免出现SettingWithCopyWarning,请使用内置的特定于列的功能:

df.fillna({1:0}, inplace=True)
于 2012-11-08T18:54:27.467 回答
166

不能保证切片返回视图或副本。你可以做

df['column'] = df['column'].fillna(value)
于 2016-10-06T09:10:08.180 回答
60

您可以使用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)
于 2017-06-15T05:11:20.373 回答
28

下面的代码对我有用。

import pandas

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

df = df.fillna(0)
于 2016-09-13T20:59:31.637 回答
27

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

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

“问题”是链接破坏了 fillna 更新原始数据帧的能力。我将“问题”放在引号中,因为设计决策有充分的理由导致在某些情况下不通过这些链进行解释。此外,这是一个复杂的示例(尽管我确实遇到过),但根据您的切片方式,这可能适用于较少级别的索引。

解决方案是 DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

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

如果有人能找到这不起作用的地方,请在评论中发布,我一直在搞乱它并查看源代码,它似乎至少解决了我的多索引切片问题。

于 2015-06-02T05:13:34.193 回答
11

您还可以使用字典来填充 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)
于 2019-07-16T20:02:37.390 回答
9

填充缺失值的简单方法:-

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

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

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

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

用零填充 NaN:

df['column name'].fillna(0, inplace = True)
于 2018-07-07T18:31:36.867 回答
6

替换 pandas 中的 na 值

df['column_name'].fillna(value_to_be_replaced,inplace=True)

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

于 2019-03-29T19:46:45.553 回答
5

在此处输入图像描述

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

df['Amount'] = df.Amount.fillna(0).astype(int)

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

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

于 2019-02-26T11:21:03.500 回答
4

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

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
于 2020-03-24T23:38:37.450 回答
4

将所有 nan 替换为 0

df = df.fillna(0)
于 2021-03-01T14:22:54.940 回答
2

主要有两种选择;如果仅用数字替换(跨列)填充或填充缺失值NaN / np.nan :

df['Amount'].fillna(value=None, method= ,axis=1,)足够了:

从文档:

value : 标量、dict、Series 或 DataFrame 用于填充孔的值(例如 0),或者指定用于每个索引(对于 Series)或列(对于 DataFrame)的值的 dict/Series/DataFrame . (不在 dict/Series/DataFrame 中的值将不会被填充)。此值不能是列表。

这意味着不再允许估算“字符串”或“常量”。

对于更专业的估算,请使用SimpleImputer()

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

于 2019-07-23T13:36:14.570 回答
2

这对我有用,但没有人提到它。会不会有什么问题?

df.loc[df['column_name'].isnull(), 'column_name'] = 0
于 2021-03-31T03:24:29.867 回答
2

如果要将其转换为 pandas 数据框,也可以使用fillna.

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

这将返回以下内容:

     0    1    2   3
0  1.0  2.0  3.0 NaN
>>> df.fillna(0)
     0    1    2    3
0  1.0  2.0  3.0  0.0
于 2019-05-15T18:20:57.580 回答
1

如果要为特定列填充 NaN,可以使用 loc:

d1 = {"Col1" : ['A', 'B', 'C'],
     "fruits": ['Avocado', 'Banana', 'NaN']}
d1= pd.DataFrame(d1)

output:

Col1    fruits
0   A   Avocado
1   B   Banana
2   C   NaN


d1.loc[ d1.Col1=='C', 'fruits' ] =  'Carrot'


output:

Col1    fruits
0   A   Avocado
1   B   Banana
2   C   Carrot
于 2020-11-07T19:03:05.147 回答
1

已经有很多贡献了,但由于我是新来的,我仍然会提供意见。

NaN在 Pandas DataFrame 中有两种方法可以用零替换值:

  1. fillna():函数使用指定的方法填充 NA/NaN 值。
  2. replace(): df.replace() 一个简单的方法,用于替换字符串、正则表达式、列表、字典

例子:

#NaN with zero on all columns
df2 = df.fillna(0)


#Using the inplace=True keyword in a pandas method changes the default behaviour.
    df.fillna(0, inplace = True)

# multiple columns appraoch
df[["Student", "ID"]] = df[["Student", "ID"]].fillna(0)

最后是 replace() 方法:

df["Student"] = df["Student"].replace(np.nan, 0)
于 2022-01-11T06:59:25.553 回答