循环所需的时间太长,无法替换值

时间:2019-04-25 07:42:22

标签: python python-2.7 loops

我有900万行代码,其中我必须用上面一行中的数字替换每个“。”。这意味着如果第1列包含“ 7”,则下面的点应替换为该点。但是,如果第3列包含“ 44”,则后续值必须替换为44,依此类推。

问题:目前需要18分钟才能处理10,000行。

您对如何优化它有任何想法吗?如果可以,请您提供验证码吗?

试图将值放入另一个df并从那里开始工作,但这会使事情稍微快一点(从18分钟到17分钟)

我不知道为什么,但是.replace无法正常工作

for x in range(0,len(BD)):
    if BD['A_SECOND'].iloc[x] <> "." :
        Second = BD['A_SECOND'].iloc[x]
    else:
        BD['A_SECOND'].iloc[x] = Second

如前所述,代码应将第一列转换为第二列:

column1old    column1new
7             7
.             7
.             7
33            33
.             33
.             33
.             33
2             2
.             2

以此类推。

谢谢! :)

2 个答案:

答案 0 :(得分:1)

以下方法在10,000行的数据帧上花了我大约0.007秒:

import pandas as pd
from timeit import default_timer as timer

df = pd.DataFrame({"column1old": ["7", ".", ".", "33", ".", ".", ".", "2", ".", "."]})
for i in range(10):
    df = pd.concat((df, df), axis=0)  # gets a df of about 10,000 rows for speed comparison


def custom_replace(df, old_column):
    last_value = ""

    def insert_value(x):
        nonlocal last_value
        if x == ".":
            return last_value
        else:
            last_value = x
            return x

    return df[old_column].apply(insert_value)


start = timer()
df["column1new"] = custom_replace(df, old_column="column1old")
end = timer()
print(end - start)  # time elapsed in seconds

答案 1 :(得分:1)

您可以将点替换为NaN值,然后使用fillna(method='ffill')

BD['A_SECOND'] = np.where(BD['A_SECOND'] == '.', np.nan, BD['A_SECOND'])
BD['A_SECOND'].fillna(method='ffill', inplace=True)