如何在pandas fillna中继续使用“None”值

时间:2017-09-18 15:42:05

标签: python pandas

我有以下字典:

fillna(value={'first_name':'Andrii', 'last_name':'Furmanets', 'created_at':None})

当我将该字典传递给fillna时,我看到了:

  

引发ValueError('必须指定填充方法或值')\ nValueError:必须指定填充方法或值\ n“

在我看来,它在None值上失败了。

我使用pandas版本0.20.3。

5 个答案:

答案 0 :(得分:8)

<强>设置
考虑示例数据框df

df = pd.DataFrame(dict(A=[1, None], B=[None, 2], C=[None, 'D']))

df

     A    B     C
0  1.0  NaN  None
1  NaN  2.0     D

我可以确认错误

df.fillna(dict(A=1, B=None, C=4))
ValueError: must specify a fill method or value

这是因为pandas循环遍历字典中的键并为每个相关列执行fillna。如果你看一下pd.Series.fillna方法的签名

Series.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

您会看到默认值为None。所以我们可以用

复制这个错误
df.A.fillna(None)

或等效

df.A.fillna()

我想补充一点,考虑到您尝试使用空值填充空值,我并不感到非常惊讶。

你需要的是一个解决方法

<强>解决方案
对要使用非空值填充的列使用pd.DataFrame.fillna。然后在特定列上使用pd.DataFrame.replace进行操作,然后将一个空值与另一个值交换。

df.fillna(dict(A=1, C=2)).replace(dict(B={np.nan: None}))

     A     B  C
0  1.0  None  2
1  1.0     2  D

答案 1 :(得分:5)

如果要使用python的None将所有null标准化。

df.fillna(np.nan).replace([np.nan], [None])

第一个fillna将用Numpy的NaN替换所有(None,NAT,np.nan等),然后用python的None替换Numpy的NaN。

答案 2 :(得分:1)

您使用的是哪种类型的数据结构?这适用于熊猫系列:

import pandas as pd

d = pd.Series({'first_name': 'Andrii', 'last_name':'Furmanets', 'created_at':None})
d = d.fillna('DATE')

答案 3 :(得分:1)

使用None填充文本的另一种方法。我在熊猫0.24.0上,这样做是为了将NULL值插入POSTGRES数据库。

# Stealing @pIRSquared dataframe
df = pd.DataFrame(dict(A=[1, None], B=[None, 2], C=[None, 'D']))

df

     A    B     C
0  1.0  NaN  None
1  NaN  2.0     D

# fill NaN with None. Basically it says, fill with None whenever you see NULL value.
df['A'] = np.where(df['A'].isnull(), None, df['A'])
df['B'] = np.where(df['B'].isnull(), None, df['B'])

# Result
df

     A    B     C
0  1.0  None  None
1  None  2.0     D

答案 4 :(得分:0)

尝试用col填充日期时间是一个坏主意,这正是pandas NaT(NotATime)的目的:缺少日期时间。