python pandas-提高多项作业的速度

时间:2018-12-21 18:55:05

标签: python pandas

我正在尝试估算形状为(30000000,22)的熊猫数据框。但是,我现在使用for循环来收集要分配的所有索引,列和新值,然后使用.loc方法来一次分配所有内容的方式非常慢。尽管for循环的运行速度不是不合理,但是最后使用.loc的分配将永远耗费时间,因为大约有2100000个值要分配。我想知道是否还有另一种方法可以在合理的时间内完成工作。非常感谢:)

def impute_original_data(data):
    data_copy = data.copy()
    missing_indices = []
    missing_columns = []
    replacements = []
    for i in range(data_copy.shape[0]):
        if i % 100000 == 0:
            print(i)
        pd_index = data_copy.iloc[i].name
        current_row = data_copy.iloc[i]
        if current_row['a'] == 0:
            missing_indices.append(pd_index)
            missing_columns.append('a')
            replacements.append(current_row['z'])
        if current_row['b'] == 0:
            missing_indices.append(pd_index)
            missing_columns.append('b')
            replacements.append(current_row['z'])
        if current_row['c'] == 0:
            missing_indices.append(pd_index)
            missing_columns.append('c')
            replacements.append(current_row['z'])
        if current_row['d'] == 0:
            missing_indices.append(pd_index)
            missing_columns.append('d')
            replacements.append(1)
        if current_row['e'] == 0:
            missing_indices.append(pd_index)
            missing_columns.append('e')
            replacements.append(current_row['z'])
        if current_row['f'] == 0:
            missing_indices.append(pd_index)
            missing_columns.append('f')
            replacements.append(0.000000001)
        if current_row['g'] == 0:
            missing_indices.append(pd_index)
            missing_columns.append('g')
            replacements.append(1)
        elif pd.isnull(current_row['h']):
            missing_indices.append(pd_index)
            missing_columns.append('h')
            replacements.append(1)
    data_copy.loc[missing_indices, missing_columns] = replacements
    return data_copy  

1 个答案:

答案 0 :(得分:0)

这种方式将更加矢量化:

missing_indices = data[(data == 0).any(axis=1) == True].index.values

missing_columns = data.columns[(data == 0).any()].values

这是在做的事情:如果存在一个带有一个或多个0的行,则将该行的索引添加到missing_indices列表中。并且,如果有一列包含一个或多个0,则将该列的名称添加到missing_columns列表中。

我不太了解您在用替换品做什么。大多数情况下,您都将其设置为列“ z”的值,然后您有一个0.000000001和一个1。可能您只是随机填充了该值以进行发布,因此可以获得更通用的解决方案。由于我无法推断出替代品的确切含义,因此我将等您提供更多信息。

希望我可以帮助您,尽管=)