如何根据熊猫数据框中的数据类型填充NaN值?

时间:2020-03-16 13:04:12

标签: python pandas dataframe missing-data fillna

向大家致意。我有一个Excel文件,我需要根据列数据类型清理和填充NaN值,例如如果列数据类型是对象,则需要在该列中填充“ NULL”,并且如果数据类型是整数或浮点数0,则需要填充在这些列中。

到目前为止,我已经尝试了两种方法来完成这项工作,但是没有运气,这是第一个

df = pd.read_excel("myExcel_files.xlsx")

使用bulit方法按数据类型选择列

df.select_dtypes(include='int64').fillna(0, inplace=True)

df.select_dtypes(include='float64').fillna(0.0, inplace=True)

df.select_dtypes(include='object').fillna("NULL", inplace=True)

我得到的输出不是错误而是警告,并且数据帧没有变化

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py:4259: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  **kwargs

因为第一个是切片错误,所以我认为一次要写一列,这是代码

df = pd.read_excel("myExcel_files.xlsx")

#get the list of all integer columns
int_cols = list(df.select_dtypes('int64').columns)

#get the list of all float columns
float_cols = list(df.select_dtypes('float64').columns)

#get the list of all object columns
object_cols = list(df.select_dtypes('object').columns)

#looping through if each column to fillna
for i in int_cols:
    df[i].fillna(0,inplace=True)

for f in float_cols:
    df[f].fillna(0,inplace=True)

for o in object_cols:
    df[o].fillna("NULL",inplace=True)

我的两种方法都不起作用。 非常感谢您的帮助或建议。 问候-Manish

1 个答案:

答案 0 :(得分:6)

我认为不必使用select_dtypes并遍历列,而可以使用DF的.dtypes并将float64的wth 0.0和对象替换为“ NULL” ...您不需要担心int64,因为它们通常不会缺少缺少的值(除非您使用pd.NA或可为null的int类型),因此您可以执行以下一项操作:

df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), inplace=True)

您还可以添加downcast='infer',这样,如果int64列中有float64个,则您将以int64个结尾,例如: / p>

df = pd.DataFrame({
    'a': [1.0, 2, np.nan, 4],
    'b': [np.nan, 'hello', np.nan, 'blah'],
    'c': [1.1, 1.2, 1.3, np.nan]
})

然后:

df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), downcast='infer', inplace=True)

将给您(请注意,列a转换为整数,但c仍然是浮动的):

   a      b    c
0  1   NULL  1.1
1  2  hello  1.2
2  0   NULL  1.3
3  4   blah  0.0