我有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
以此类推。
谢谢! :)
答案 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)