我有一个混合的数据框,其中的列具有不同的类型:
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仅回答两列。我正在寻找包含几列的解决方案。
答案 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