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  

这种方式会更加矢量化:

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。可能您只是随机填写了它以进行发布,因此您可以获得更通用的解决方案。由于我无法准确推断您的替代品的含义,因此我将等待您提供更多信息。

希望我能为您提供一些帮助,不过=)

最新更新