用NaN填充所有字符串列的NaN,用0填充所有数字列的NaN

时间:2020-08-24 07:06:32

标签: python pandas

我有一个混合的数据框,其中的列具有不同的类型:

df
A   float64
B   object
C   int64

如何运行fillna(),但未收到错误消息:TypeError: argument must be a string or number

我的意思是如何将所有数字类型都用0(作为数字值)填充,并将所有对象类型都用NaN(作为字符串)填充。

类似的问题:Replace missing values at once in both categorical and numerical columns仅回答两列。我正在寻找包含几列的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以按列名称创建字典,并使用其值替换缺失的值并传递到DataFrame.fillna

df= pd.DataFrame(data={'col1': [np.nan,'b','c','d'],
                       'col2': [1,2,np.nan,4],
                       'col3': [np.nan,'b','c','d'],
                       'col4': [1,2,np.nan,4]})

print (df)
  col1  col2 col3  col4
0  NaN   1.0  NaN   1.0
1    b   2.0    b   2.0
2    c   NaN    c   NaN
3    d   4.0    d   4.0

d = {**dict.fromkeys(df.select_dtypes(np.number).columns, 0), 
     **dict.fromkeys(df.select_dtypes(exclude=np.number).columns, 'tmp')}

df = df.fillna(d)
print (df)
  col1  col2 col3  col4
0  tmp   1.0  tmp   1.0
1    b   2.0    b   2.0
2    c   0.0    c   0.0
3    d   4.0    d   4.0

另一个想法是先替换数字,然后替换所有其他列:

c = df.select_dtypes(np.number).columns

df[c] = df[c].fillna(0)
df = df.fillna('tmp')
print (df)
  col1  col2 col3  col4
0  tmp   1.0  tmp   1.0
1    b   2.0    b   2.0
2    c   0.0    c   0.0
3    d   4.0    d   4.0