Python 对于大型数据集,更快地将列中的-1和0替换为NAN

Python 对于大型数据集,更快地将列中的-1和0替换为NAN,python,pandas,jupyter-notebook,Python,Pandas,Jupyter Notebook,“azdias”是一个数据框,它是我的主要数据集,元数据或其特征摘要位于数据框“feat_info”中。“feat_信息”显示每列中显示为NaN的值 Ex:column1的值[-1,0]为NaN值。因此,我的工作将是在第1列中找到并替换这些-1,0作为NaN azdias数据帧: 专长信息数据帧: 我试着在jupyter笔记本中跟踪 def NAFunc(x, miss_unknown_list): x_output = x for i in miss_unknown_list

“azdias”是一个数据框,它是我的主要数据集,元数据或其特征摘要位于数据框“feat_info”中。“feat_信息”显示每列中显示为NaN的值

Ex:column1的值[-1,0]为NaN值。因此,我的工作将是在第1列中找到并替换这些-1,0作为NaN

azdias数据帧:

专长信息数据帧: 我试着在jupyter笔记本中跟踪

def NAFunc(x, miss_unknown_list):
    x_output = x
    for i in miss_unknown_list:
        try:
            miss_unknown_value = float(i)
        except ValueError:
            miss_unknown_value = i
        if x == miss_unknown_value:
            x_output = np.nan
            break
    return x_output

for cols in azdias.columns.tolist():
    NAList = feat_info[feat_info.attribute == cols]['missing_or_unknown'].values[0]
    azdias[cols] = azdias[cols].apply(lambda x: NAFunc(x, NAList))

问题1:我试图估算NaN值。但是我的代码非常简单 慢点。我希望加快我的执行过程

我已附上两个数据帧的示例:

阿兹迪亚斯样本

  AGER_TYP ALTERSKATEGORIE_GROB ANREDE_KZ CJT_GESAMTTYP FINANZ_MINIMALIST
0   -1          2                    1         2.0             3
1   -1          1                    2         5.0             1
2   -1          3                    2         3.0             1
3    2          4                    2         2.0             4
4   -1          3                    1         5.0             4
专长信息样本

attribute            information_level       type          missing_or_unknown           
AGER_TYP                     person       categorical            [-1,0]
ALTERSKATEGORIE_GROB         person       ordinal                [-1,0,9]
ANREDE_KZ                    person       categorical            [-1,0]
CJT_GESAMTTYP                person       categorical            [0]
FINANZ_MINIMALIST            person       ordinal                [-1]
尝试使用DataFrame的方法。这个怎么样

azdias.columns.tolist()中的c的

替换\u列表=专长信息[专长信息['attribute']==c]['missing\u或\u unknown']
azidias[c]=azidias[c].replace(to_replace=list(replace_list),value=np.nan)
在无法执行代码的情况下,有几件事我不确定:

  • 在您的示例中,使用了
    .values[0]
    。你不想要所有的值吗
  • 我不确定是否有必要执行
    to_replace=list(replace_list)
    ,只需使用
    to_replace=replace_list
  • 总的来说,我建议你自己想一想“熊猫肯定有为我做这件事的功能。”通常,它们是这样做的。对于熊猫的表演,一般避免循环和设置东西。矢量化方法往往要快得多。

    尝试使用数据帧的方法。这个怎么样

    azdias.columns.tolist()中的c的
    
    替换\u列表=专长信息[专长信息['attribute']==c]['missing\u或\u unknown']
    azidias[c]=azidias[c].replace(to_replace=list(replace_list),value=np.nan)
    
    在无法执行代码的情况下,有几件事我不确定:

  • 在您的示例中,使用了
    .values[0]
    。你不想要所有的值吗
  • 我不确定是否有必要执行
    to_replace=list(replace_list)
    ,只需使用
    to_replace=replace_list

  • 总的来说,我建议你自己想一想“熊猫肯定有为我做这件事的功能。”通常,它们是这样做的。对于熊猫的表演,一般避免循环和设置东西。矢量化方法往往更快。

    如果从
    read\u csv
    或类似IO函数获取
    azdias
    数据集,
    na_values
    关键字参数可用于指定特定于列的缺失值表示,以确保返回的数据帧从一开始就具有适当的NaN值。示例代码如下所示

    from ast import literal_eval
    
    feat_info.set_index("attribute", inplace=True) 
    # A more concise but less efficient alternative is
    # na_dict = feat_info["missing_or_unknown"].apply(literal_eval).to_dict()
    na_dict = {attr: literal_eval(val) for attr, val in feat_info["missing_or_unknown"].items()}
    df_azdias = pd.read_csv("azidas.csv", na_values=na_dict)
    

    对于数据类型,整数数据类型没有内置的NaN表示。因此需要浮点数据类型。如果使用
    fillna
    填充缺少的值,则可以指定
    downcast
    参数,以使返回的序列或数据帧具有适当的数据类型。

    如果
    azdias
    数据集是从
    读取csv
    或类似IO函数获得的,
    na_values
    关键字参数可用于指定特定于列的缺失值表示,以确保返回的数据帧从一开始就具有适当的NaN值。示例代码如下所示

    from ast import literal_eval
    
    feat_info.set_index("attribute", inplace=True) 
    # A more concise but less efficient alternative is
    # na_dict = feat_info["missing_or_unknown"].apply(literal_eval).to_dict()
    na_dict = {attr: literal_eval(val) for attr, val in feat_info["missing_or_unknown"].items()}
    df_azdias = pd.read_csv("azidas.csv", na_values=na_dict)
    

    对于数据类型,整数数据类型没有内置的NaN表示。因此需要浮点数据类型。如果使用
    fillna
    填充缺少的值,则可以指定
    downcast
    参数,以使返回的序列或数据帧具有适当的数据类型。

    Hi@blthayer。谢谢你的回复。我仅从表示NaN的feat_信息中提取特定列的值。因此我取值[0]。例如:对于AGER_类型,它将获取列表[-1,0],而且缺失的_或未知的_的值是字符串格式,需要首先转换以匹配列的数据类型。因此,使用来代替向我抛出一个错误。@KaustubhUrsekar-至于你的第一条评论:明白。至于您的第二条评论:在调用替换之前,请尝试在
    缺少的\u或\u未知的
    数组上使用,将它们转换为正确的类型。请注意,
    atype
    numpy.ndarray
    的一种方法,因此在我上面的代码中,您需要在调用
    list(replace_list)
    hi brother!!我已附上文本文件作为示例,以帮助您尝试在您的身边!:)兄弟,我需要浮点数,但问题是当我扫描专长信息的数据帧时。我也认为“Xx”代表南。因此,我无法将它们转换为一种数据类型。因此,我通过阅读文档在代码中编写了try和except函数。但是,我非常关注函数执行转换和插补NaN所消耗的时间。总行数约为890000行。Hi@blthayer。谢谢你的回复。我仅从表示NaN的feat_信息中提取特定列的值。因此我取值[0]。例如:对于AGER_类型,它将获取列表[-1,0],而且缺失的_或未知的_的值是字符串格式,需要首先转换以匹配列的数据类型。因此,使用来代替向我抛出一个错误。@KaustubhUrsekar-至于你的第一条评论:明白。至于您的第二条评论:在调用替换之前,请尝试在
    缺少的\u或\u未知的
    数组上使用,将它们转换为正确的类型。请注意,
    atype
    numpy.ndarray
    的一种方法,因此在我上面的代码中,您需要在调用
    list(replace_list)
    hi brother!!我已附上文本文件作为示例,以帮助您尝试在您的身边!:)兄弟,我需要浮点数,但问题是当我扫描专长信息的数据帧时。我也认为“Xx”代表南。因此,我无法将它们转换为一种数据类型。因此,我通过阅读文档在代码中编写了try和except函数