Python 如何将数据帧列中的NaN值替换为零?
我有一个熊猫数据框,如下所示:Python 如何将数据帧列中的NaN值替换为零?,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,我有一个熊猫数据框,如下所示: 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
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
尝试将函数应用于“金额”列时,出现以下错误:
ValueError: cannot convert float NaN to integer
我尝试使用数学模块中的.isnan应用函数
我试过熊猫了。替换属性
我尝试了0.9中的.sparse数据属性
我还尝试了函数中的if-NaN==NaN语句。
在阅读其他文章的同时,我也阅读了这篇文章。
我尝试过的所有方法都不起作用,或者不认识NaN。
任何提示或解决方案都将不胜感激。我相信
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
要仅在一列中填充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
编辑:
df['column name'].fillna(0, inplace = True)
replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
df.fillna(value=replacement)
要避免设置CopyWarning,请使用内置的特定于列的功能:
df.fillna({1:0}, inplace=True)
我只是想提供一点更新/特例,因为看起来人们仍然会来这里。如果您使用的是多索引或其他索引切片器,那么inplace=True选项可能不足以更新您选择的切片。例如,在2x2级别的多索引中,这不会更改任何值(从0.15开始):
idx=pd.indexlice
df.loc[idx[:,mask_1],idx[mask_2,:].fillna(值=0,inplace=True)
“问题”是链接破坏了fillna更新原始数据帧的能力。我把“问题”放在引号里,因为设计决策有很好的理由导致在某些情况下不通过这些链进行解释。此外,这是一个复杂的示例(尽管我确实遇到过),但根据切片方式的不同,这可能适用于更少级别的索引
解决方案是DataFrame.update:
df.update(df.loc[idx[:,mask_1],idx[[mask_2],:].fillna(值=0))
这是一行,读起来相当好(有点),消除了中间变量或循环的任何不必要的混乱,同时允许您将fillna应用于任何您喜欢的多级切片
如果有人能找到这个不起作用的地方,请在评论中发表,我一直在搞乱它,并查看源代码,它似乎至少解决了我的多索引切片问题。下面的代码对我很有用
import pandas
df = pandas.read_csv('somefile.txt')
df = df.fillna(0)
不能保证切片返回视图或副本。你能行
df['column'] = df['column'].fillna(value)
您可以使用将NaN
更改为0
:
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)
填充缺失值的简单方法:-
填充字符串列:当字符串列缺少值和NaN值时
df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)
df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)
填充数字列:当数字列缺少值和NaN值时
df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)
df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)
用零填充NaN:
df['column name'].fillna(0, inplace = True)
replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
df.fillna(value=replacement)
考虑到上表中的特定列金额
为整数类型。以下是一个解决方案:
df['Amount'] = df.Amount.fillna(0).astype(int)
类似地,您可以用各种数据类型填充它,如float
、str
等等
特别是,我考虑数据类型来比较同一列的各种值。
< P>代替熊猫NA值< /P>
df['column_name'].fillna(value_to_be_replaced,inplace=True)
如果inplace=False
,它将返回修改后的值,而不是更新df(数据帧) 如果要将其转换为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
您还可以使用字典来填充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)
主要有两种选择;如果插补或填充缺失值NaN/np.NaN,仅使用数字替换(跨列):
df['Amount'].fillna(值=None,方法=,轴=1,)
足够了:
从文件中:
值:标量、dict、序列或数据帧
用于填充孔的值(例如0),或者
dict/Series/DataFrame值,指定要用于的值
每个索引(对于一个系列)或列(对于一个数据帧)。(值不是
将不填充dict/Series/DataFrame中的)。此值不能为空
这是一张单子
这意味着不再允许插补“字符串”或“常量”
对于更专门的插补,请使用SimpleComputer():
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']])
以不同方式替换不同列中的nan:
df['column name'].fillna(0, inplace = True)
replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
df.fillna(value=replacement)
如果要为特定列填写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
将所有nan替换为0
这对我来说很有效,但没人提到。这有什么问题吗
df.loc[df['column_name'].isnull(), 'column_name'] = 0
是否保证df[1]
是一个视图,而不是原始DF的副本?显然,如果它是副本的情况很少见,它会导致一个超级麻烦的错误。熊猫文档中对此有明确的说明吗?@max看到这一点,可能会回答您的问题:谢谢。我的理解正确吗,在这个回答中,“设置的索引器”是最外层的索引操作(在赋值之前执行)。因此,任何只使用单个索引器的赋值都保证是安全的,从而使您的代码安全?为什么这对我不起作用?请参阅:上一个示例使用CopyWarning抛出一个设置刚刚发现“inplace=True”问题。这个答案避免了这个问题,我认为这是最干净的解决方案。唯一的问题是df.fill.na()如果应用它的数据帧被重新采样或已通过loc函数切片,则不起作用。它将仅替换NaN
?或它也将替换NA
或NaN
中的值,如df.fillna(0)
?我正在寻找只替换存在NaN
的值而不替换NA
@ShyamBhimani的解决方案,它应该只替换NaN
的值,即