我有一个数据框如下
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数据属性 我也尝试过函数中的NaN == NaN语句。 在查看其他一些文章的同时,我也查看了这篇文章How do I replace NA values with zeros in an R dataframe?。 我尝试的所有方法都没有工作或者没有认识到NaN。 任何提示或解决方案将不胜感激。
答案 0 :(得分:567)
我相信DataFrame.fillna()
会为你做这件事。
链接到a dataframe和a Series的文档。
示例:
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
答案 1 :(得分:87)
无法保证切片返回视图或副本。你可以做到
df['column'] = df['column'].fillna(value)
答案 2 :(得分:20)
我只想提供一些更新/特殊情况,因为看起来人们仍然来到这里。如果您正在使用多索引或使用索引切片器,则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应用于您喜欢的任何多级切片!
如果任何人都可以找到不起作用的地方,请在评论中发帖,我一直在搞乱它并查看源代码,它似乎至少解决了我的多索引切片问题。
答案 3 :(得分:19)
您可以使用replace
将rotation.y += dolly.rotation.y
更改为NaN
:
0
答案 4 :(得分:18)
以下代码对我有用。
import pandas
df = pandas.read_csv('somefile.txt')
df = df.fillna(0)
答案 5 :(得分:4)
轻松填写缺失值的方法:-
填充:字符串列:当字符串列中缺少值和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)
用0填充NaN:
df['column name'].fillna(0, inplace = True)
答案 6 :(得分:2)
用不同的方式替换不同列中的nan:
replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
df.fillna(value=replacement)
答案 7 :(得分:1)
要替换熊猫中的na值
df['column_name'].fillna(value_to_be_replaced,inplace=True)
如果inplace = False
,则不更新df(数据帧),而是返回修改后的值。
答案 8 :(得分:1)
如果要将其转换为熊猫数据框,也可以使用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
答案 9 :(得分:1)
用 0 替换所有的 nan
df = df.fillna(0)
答案 10 :(得分:0)
考虑到上表中的特定列Amount
是整数类型。以下是解决方案:
df['Amount'] = df.Amount.fillna(0).astype(int)
同样,您可以用float
,str
等各种数据类型来填充它。
特别是,我会考虑使用数据类型来比较同一列的各种值。
答案 11 :(得分: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)
答案 12 :(得分:0)
主要有两个选项;插补或填充缺失值 NaN / np.nan 时,仅用数字替换(跨列:
df['Amount'].fillna(value=None, method= ,axis=1,)
就足够了:
从文档中:
value:标量,dict,Series或DataFrame 用于填充孔的值(例如0),或者 值的dict / Series / DataFrame指定用于哪个值 每个索引(对于系列)或列(对于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']])
答案 13 :(得分:0)
如果要为特定列填充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
答案 14 :(得分:0)
这对我有用,但没有人提到它。会不会有什么问题?
df.loc[df['column_name'].isnull(), 'column_name'] = 0