我正在尝试估算形状为(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
答案 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。可能您只是随机填充了该值以进行发布,因此可以获得更通用的解决方案。由于我无法推断出替代品的确切含义,因此我将等您提供更多信息。
希望我可以帮助您,尽管=)