如何根据pandas数据框中的数据类型填充NaN值?
How to fill NaN values according to the data type in pandas data frame?
大家好。我有一个 excel 文件,我需要根据列数据类型清理和填充 NaN 值,比如如果列数据类型是对象我需要在该列中填充 "NULL" 并且数据类型是整数或float 0 需要填写在这些列中。
到目前为止,我已经尝试了 2 种方法来完成这项工作,但没有成功,这是第一种
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
我认为,与其使用 select_dtypes
并遍历列,不如使用 DF 的 .dtypes
并将 float64 替换为 0.0,将对象替换为 "NULL"...不需要担心 int64,因为它们通常不会有缺失值需要填充(除非您使用 pd.NA
或可为 null 的 int 类型),因此您可以执行以下操作:
df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), inplace=True)
您还可以添加 downcast='infer'
,这样如果您在 float64
列中有可以是 int64
的内容,您最终会得到 int64
,例如给定:
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
被向下转换为 int 但 c
仍然是 float):
a b c
0 1 NULL 1.1
1 2 hello 1.2
2 0 NULL 1.3
3 4 blah 0.0
大家好。我有一个 excel 文件,我需要根据列数据类型清理和填充 NaN 值,比如如果列数据类型是对象我需要在该列中填充 "NULL" 并且数据类型是整数或float 0 需要填写在这些列中。
到目前为止,我已经尝试了 2 种方法来完成这项工作,但没有成功,这是第一种
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
我认为,与其使用 select_dtypes
并遍历列,不如使用 DF 的 .dtypes
并将 float64 替换为 0.0,将对象替换为 "NULL"...不需要担心 int64,因为它们通常不会有缺失值需要填充(除非您使用 pd.NA
或可为 null 的 int 类型),因此您可以执行以下操作:
df.fillna(df.dtypes.replace({'float64': 0.0, 'O': 'NULL'}), inplace=True)
您还可以添加 downcast='infer'
,这样如果您在 float64
列中有可以是 int64
的内容,您最终会得到 int64
,例如给定:
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
被向下转换为 int 但 c
仍然是 float):
a b c
0 1 NULL 1.1
1 2 hello 1.2
2 0 NULL 1.3
3 4 blah 0.0