2016-01-21 106 views
13

我有一个混合类型的熊猫数据框,有些是字符串,有些是数字。我想通过替换字符串列的NAN值和楠0Python中的多列填充熊猫熊猫

值浮动列考虑这个小虚构例如“”:

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写了很多行。有没有一个简洁的方式来做到这一点?

+0

在你真实的例子中,字符串列是'NaN'还是字符串''NaN''? – EdChum

+0

NaN,不是字符串'NaN' – ozzy

回答

10

你可以使用apply为您列与检查dtype无论是numeric或不通过检查dtype.kind

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 
+0

这很短暂,它的工作原理!谢谢 – ozzy

5

您可以手动列出字符串列或从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) 
+0

这个工程!谢谢! – ozzy

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 

如果你想在一些其他的方式来填补不同D型的列,您可以添加其他的elif语句。现在,应用此功能,在数据帧中的所有列

df = df.apply(myfillna) 

这是一样的“就地”

+0

这是有意义的写作功能。但是,我们不需要把它写成'for col in df.columns:df [col] = df.apply(myfillna)'?该函数返回一个系列,我们用这个替换整个数据框。 – ozzy

+0

否,因为默认情况下apply的参数axis = 0,这意味着将函数应用于每列,然后将结果作为数据框返回给新列。 – latorrefabian

+0

所以实际上df.apply(myfillna)正在做你在幕后建议的事情。 – latorrefabian