2016-01-21 124 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