【问题标题】:Cannot fill NaN values in multiple columns by lambda in pandas无法通过熊猫中的lambda填充多列中的NaN值
【发布时间】:2019-08-17 01:09:47
【问题描述】:

我试图在我的 DataFrame all_files_d 中用 0 填充所有浮点列 NaN 值,然后将其放入一个空列表或名为 ts 的 DataFrame 中。

我的数据样本如下:

 ColX              ColY
 56.9              6.4
 67.5              NaN
 NaN               8.9
 NaN               NaN

我已尝试遵循此问题代码,因为它似乎对某些用户有效,但似乎存在 NaN 值并且它没有填充任何内容:

Fillna in multiple columns in place in Python Pandas

这是我的代码:

ts = []
all_files_d.apply(lambda x: x.fillna(0, inplace = True) if x.dtype.kind
 in 'f' else x.fillna('.', inplace = True), axis = 1)

ts.append(all_files_d)

我希望得到以下结果,所有 NaN 都填充为 0。提前致谢。

 ColX              ColY
 56.9              6.4
 67.5              0
 0                 8.9
 0                 0

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    combine_firstpd.to_numeric() 一起使用:

    经过测试(添加了一个额外的字符串列):

    df['Colz']=['abc',np.nan,'def',np.nan]
    print(df)
    
       ColX ColY Colz
    0  56.9  6.4  abc
    1  67.5  NaN  NaN
    2   NaN  8,9  def
    3   NaN  NaN  NaN
    

    df.combine_first(df.apply(lambda x: \
          pd.to_numeric(x,errors='coerce')).dropna(how='all',axis=1).fillna(0))
    

    输出

       ColX ColY Colz
    0  56.9  6.4  abc
    1  67.5    0  NaN
    2   0.0  8,9  def
    3   0.0    0  NaN
    

    编辑,用于获取浮点数据类型并填充 NaN:

    m=df.select_dtypes('float').columns 
    df.loc[:,m]=df.loc[:,m].fillna(0) 
    print(df)
    

    【讨论】:

    • 仍然有 NaN,这很奇怪。这是就地方法吗?
    • @geds133 不,你必须分配它df=df.combine_first(.....) 然后打印(df)
    • @geds133 没问题。 :) 还有一件事,举例来说,如果你有像8,9 这样的数据,这是一个错字还是你在浮点列中有字符串?
    • @geds133 没问题。 :) 还有一件事,举例来说,如果你有像8,9 这样的数据,这是一个错字还是你在浮点列中有字符串?
    • 谢谢。您可能想要编辑您的答案并添加正确的答案,同时更改我的输入错误以使其他人清楚。
    【解决方案2】:

    IIUC,

    ts = df.apply(lambda x: x.fillna(0) if x.dtypes == float else x.fillna('.'))
    
    
        ColX    ColY
    0   56.9    6.4
    1   67.5    0.0
    2   0.0     8.9
    3   0.0     0.0
    

    【讨论】:

    • 预期输出将上述列中的 NaN 填充为 0,因此我假设 8,9 是一个错字。会看到,目前还不是很清楚
    • 仍然有 NaN。我确定我的数据在这里有些地方不太正确,但我无法弄清楚为什么 float64 列中会留下连续的 NaN 值。
    • df.dtypes 的输出是什么?
    • 列的输出为 float64
    【解决方案3】:

    使用df.select_dtype()

    # fillna to float64 columns
    ts = df.select_dtypes(include=['float64']).fillna(0) 
    
    # merge data
    df.join(ts, lsuffix="_").reindex(df.columns, axis=1)
    

    【讨论】:

    • 仍然包含 NaN。我也不想直接填写ts,我想在最后追加,这样我可以在两者之间做其他操作。
    • df.dtypes 对那些带有剩余 NaN 的列有什么看法?可能他们是object 类型??
    • 它们是float64
    • 再一次,我不想直接分配给ts,只是追加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2016-01-16
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多