加快功能执行

时间:2019-07-23 23:45:04

标签: python pandas

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

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

azdias数据框: enter image description here

feat_info数据框: enter image description here 我尝试在jupyter笔记本中关注。

WITH MgrCount AS (
select MGR_1 AS Mgr, COUNT(EMPL_ID) AS REP_GRP
FROM CountMGR 
WHERE MGR_1 IS NOT NULL
GROUP BY MGR_1
UNION ALL 
select MGR_2 AS Mgr, COUNT(EMPL_ID) AS REP_GRP
FROM CountMGR 
WHERE MGR_2 IS NOT NULL
GROUP BY MGR_2
)

SELECT EMPL_ID, MGR_1, MGR_2, COALESCE (REP_GRP, 0)
FROM CountMGR AS M
LEFT OUTER JOIN MgrCount AS C ON M.EMPL_ID = C.Mgr

问题1:我正在尝试估算NaN值。但是我的代码非常    慢。我希望加快执行速度。

问题2:我也觉得“ azdias”中其余的数据值是    转换为浮点数。我不希望发生这种情况,只是确保    只能替换NaN并且没有更改数据类型!

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

azdias_sample

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))

feat_info_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

2 个答案:

答案 0 :(得分:0)

尝试使用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一起表演,请避免循环播放和设置内容。向量化方法往往更快。

答案 1 :(得分:0)

如果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表示形式。因此,需要一个float数据类型。如果使用fillna来估算缺失值,则可以指定downcast参数以使返回的序列或数据帧具有适当的数据类型。