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

Posted

技术标签:

【中文标题】如何根据 pandas 数据框中的数据类型填充 NaN 值?【英文标题】:How to fill NaN values according to the data type in pandas data frame? 【发布时间】:2020-06-27 14:23:23 【问题描述】:

大家好。我有一个 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

【问题讨论】:

你要么这样做:df[i] = df[i].fillna(0) 要么 df[i].fillna(0,inplace=True) 我试过这两个 df[i] = df[i].fillna(0) 使整个列 None 和这个 df[i].fillna(0,inplace=True) 抛出警告 您应该提供示例输入数据。否则我们无法重现您的问题。它在一个简单的例子中为我工作 感谢@luigigi,它现在可以工作了,df[i] = df[i].fillna(0) 不支持就地参数 【参考方案1】:

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

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

您还可以添加downcast='infer',这样如果您在float64 列中有int64s,您最终会得到int64s,例如:

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 保持浮动):

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

【讨论】:

cells ='A1:T635785' df = pd.read_excel("Compiled_text_clean.xlsx") 还有一个问题,如果您能提供帮助 - cells ='A1:T635785' 为什么该解决方案仅适用于由此代码 df = pd.read_excel("Compiled_text_clean.xlsx") 而不是使用此代码使用 xlwings df = sheet.range(cells).options(pd.DataFrame, index =False).value 因为我有一个巨大的文件并且 xlwings 的运行速度比 pd.read_excel 方法快 @Manish 我不确定 - 我不认为我曾经使用过 xlwings...它返回的 DF 是否与 .dtypespd.read_excel 一样? 是的,数据框是完全一样的,但是当在它上面运行这个代码时,它给了我同样的 SettingWithCopyWarning 错误 @Manish 好奇...不要认为我可以在那里提供太多帮助,因为我没有安装 xlwings 并且可能没有任何数据保证可以重现相同的问题进行测试.. .

以上是关于如何根据 pandas 数据框中的数据类型填充 NaN 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?

用 Pandas 数据框中的行填充嵌套字典

如何根据列中的最新日期聚合 pandas 数据框中的行?

Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]

定义在 pandas 数据框中填充 NaN 的策略?

合并 Pandas 数据框中的 2 列,用前一个值填充 NaN [重复]