Fillna在Python Pandas中的多个列中

时间:2016-01-21 01:00:26

标签: python pandas dataframe

我有一个混合类型的pandas dataFrame,有些是字符串,有些是数字。我想用'。'替换字符串列中的NAN值,将浮点列中的NAN值替换为0.

考虑这个小小的虚构例子:

df = pd.DataFrame({'Name':['Jack','Sue',pd.np.nan,'Bob','Alice','John'],
    'A': [1, 2.1, pd.np.nan, 4.7, 5.6, 6.8],
    'B': [.25, pd.np.nan, pd.np.nan, 4, 12.2, 14.4],
    'City':['Seattle','SF','LA','OC',pd.np.nan,pd.np.nan]})

现在,我可以用3行来完成:

df['Name'].fillna('.',inplace=True)
df['City'].fillna('.',inplace=True)
df.fillna(0,inplace=True)

由于这是一个小型数据帧,因此3行可能没问题。在我的实际例子中(由于数据机密性原因,我不能在这里分享),我有更多的字符串列和数字列。所以我最终只为fillna写了很多行。这样做有简洁的方法吗?

7 个答案:

答案 0 :(得分:18)

您可以使用apply为您的列检查dtype,检查numeric是否为res = df.apply(lambda x: x.fillna(0) if x.dtype.kind in 'biufc' else x.fillna('.')) print(res) A B City Name 0 1.0 0.25 Seattle Jack 1 2.1 0.00 SF Sue 2 0.0 0.00 LA . 3 4.7 4.00 OC Bob 4 5.6 12.20 . Alice 5 6.8 14.40 . John

{{1}}

答案 1 :(得分:11)

您可以手动列出字符串列,也可以从df.dtypes收集字符串列。获得字符串/对象列的列表后,您可以立即在所有这些列上调用fillna

# str_cols = ['Name','City']
str_cols = df.columns[df.dtypes==object]
df[str_cols] = df[str_cols].fillna('.')
df.fillna(0,inplace=True)

答案 2 :(得分:7)

在寻找此问题的答案时,在此页面上出现,但不喜欢现有答案。我最终在DataFrame.fillna documentation中发现了一些更好的东西,并认为我会为发生此事的其他人做出贡献。

如果您有多列,但只想替换其中的NaN,则可以使用:

df.fillna({'Name':'.', 'City':'.'}, inplace=True)

这还允许您为每列指定不同的替换。而且,如果您想继续填写所有其余的NaN值,则可以在末尾再抛出一个fillna

df.fillna({'Name':'.', 'City':'.'}, inplace=True).fillna(0, inplace=True)

答案 3 :(得分:1)

定义一个函数:

def myfillna(series):
    if series.dtype is pd.np.dtype(float):
        return series.fillna(0)
    elif series.dtype is pd.np.dtype(object):
        return series.fillna('.')
    else:
        return series

如果要以其他方式填充不同dtype的列,可以添加其他elif语句。现在将此函数应用于数据框的所有列

df = df.apply(myfillna)

这与'inplace'相同

答案 4 :(得分:0)

如果你想用相同的值(“v”)替换一列列(“lst”)

def nan_to_zero(df, lst, v):
    d = {x:v for x in lst}
    df.fillna(d, inplace=True)
    return df

答案 5 :(得分:-1)

有一种更简单的方法,可以一行完成:

df.fillna({'Name':0,'City':0},inplace=True)

这不是一个了不起的改进,但是如果将其乘以100,则只写列名+':0'比复制和粘贴所有内容100次要快得多。

答案 6 :(得分:-1)

最简单的方法是:dt.replace(pd.np.nan, "NA")。 如果您要进行其他替换,则应使用下一个:dt.replace("pattern", "replaced by (new pattern)")