【问题标题】:Changing DataFrame with .apply() depending on NaN values根据 NaN 值使用 .apply() 更改 DataFrame
【发布时间】:2021-05-18 09:08:51
【问题描述】:

我想用 1 替换我的数据框中的每个 NaN 值,用 0 替换每个其他值。这只是我需要根据一列中的 NaN 值更改 df 的项目的一个示例。

我尝试了 isnull()、isnan()、x.Field_2 和更多变体。 isnull 的文档也没有真正帮助我。我用谷歌搜索了很多,只找到了可以获取 df 的所有 NaN 值的操作。

我猜问题是 x['Field_2'].isnull() 正在返回一个数组,但我想不出其他可以改变 df 的东西。基本上我正在寻找一种方法来检查每一行是否单元格是 NaN 并为每个单元格执行它。

我的错误信息:

KeyError: 'Field_2'
# importing pandas and numpy libraries 
import pandas as pd 
import numpy as np 

# creating and initializing a nested list 
values_list = [[15, 2.5, np.nan], [20, 4.5, 50], [25, 5.2, 80], 
            [45, 5.8, 48], [40, np.nan, 70], [41, 6.4, 90], 
            [51, 2.3, 111]] 

# creating a pandas dataframe 
df = pd.DataFrame(values_list, columns=['Field_1', 'Field_2', 'Field_3'], 
                index=['a', 'b', 'c', 'd', 'e', 'f', 'g']) 

df = df.apply(lambda x: 1 if x['Field_2'].isnull() else 0) 

---------解决方案

通过您的帮助,我可以解决我的问题。非常感谢! - 最终解决方案:

resultList = df.apply(lambda x: x['Field_1'] if pd.isna(x['Field_2']) else x['Field_2'], axis=1) 

df['newColumn'] = resultList
df

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    我认为这里的循环没有必要使用 DataFrame.isna 并转换为整数以进行 True/False1/0 的映射:

    df = df.isna().astype(int) 
    print (df)
    
       Field_1  Field_2  Field_3
    a        0        0        1
    b        0        0        0
    c        0        0        0
    d        0        0        0
    e        0        1        0
    f        0        0        0
    g        0        0        0
    

    您的解决方案应更改为 axis=1 for 每行循环,并使用测试标量 pandas.isna

    df = df.apply(lambda x: 1 if pd.isna(x['Field_2']) else 0, axis=1) 
    

    【讨论】:

      猜你喜欢
      • 2015-10-05
      • 2020-12-31
      • 2020-08-07
      • 2019-09-29
      • 2012-10-15
      • 2019-04-06
      • 1970-01-01
      • 2022-01-23
      • 2020-02-20
      相关资源
      最近更新 更多