繁体   English   中英

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

[英]faster replacement of -1 and 0 to NaNs in column for a large dataset

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

例如:column1 的值为 [-1,0] 作为 NaN 值。 所以我的工作是找到并替换 column1 中的这些 -1,0 为 NaN。

azdias 数据框: 在此处输入图片说明

feat_info 数据框: 在此处输入图片说明 我试过在 jupyter notebook 中关注。

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 值。 但是我的代码很慢。 我希望加快我的执行过程。

我附上了两个数据框的样本:

azdias_sample

  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

feat_info_sample

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 的replace方法。 这个怎么样?

for c in azdias.columns.tolist():
    replace_list = feat_info[feat_info['attribute'] == c]['missing_or_unknown'].values
    azidias[c] = azidias[c].replace(to_replace=list(replace_list), value=np.nan)

如果无法执行您的代码,我不确定一些事情:

  1. 在您的示例中,您使用了.values[0] 你不想要所有的值吗?
  2. 我不确定是否有必要做to_replace=list(replace_list) ,它可能只使用to_replace=replace_list

总的来说,我建议你自己思考“Pandas 肯定有一个功能可以为我做这件事。” 通常,他们会这样做。 对于 Pandas 的一般性能,避免循环和设置。 矢量化方法往往要快得多。

如果azdias数据集是从read_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参数以使返回的系列或数据框具有适当的数据类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM