我目前正在使用python pandas来自动执行excel操作,并存在一些有关较大excel文件的速度问题。现在,我尝试逐步优化。
脚本的第二步将创建3个新列:error1,error2或Correct。 如果DATE2中没有任何信息(NaN),则错误1的值应为“ x”。如果DATE2中有一个值,并且在DATE1之后,则只有error2的值应为“ x”。如果这两个比较都没有命中,则只有正确的值应该为“ x”。
我的问题是现在如何将这样的比较矢量化,以及如何避免整个字符串转换,因为我认为这也需要更多时间。
要优化的代码:
#step 2 manipulate excel
import arrow
for i,row in df.iterrows():
if str(row['DATE2']) == "nan":
df.loc[i, "ERROR1"] = "x"
for i,row in df.iterrows():
date1str = str(row['DATE1'])[:10]
date1 = arrow.get(date1str, "YYYY-MM-DD").date()
if str(row['DATE2']) != "nan":
date2 = arrow.get(str(row['DATE2'])[:10], 'YYYY-MM-DD').date()
if date2 > date1:
df.loc[i, "ERROR2"] = "x"
for i,row in df.iterrows():
if str(row['ERROR1']) == "nan" and str(row['ERROR2']) == "nan":
df.loc[i, "CORRECT"] = "x"
print("step 2 done...")
我已经尝试过的代码:
def choose(inp):
if pd.isnull(inp):
return "x"
else:
return ""
df['ERROR1'] = choose(df['DATE2'])
我尝试的代码给了我以下错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
答案 0 :(得分:0)
说实话,我不确定为什么要这么做,但是你去了
df['DATE1'] = pd.to_datetime(df['DATE1'], errors = 'coerce')
df['DATE2'] = pd.to_datetime(df['DATE2'], errors = 'coerce')
# Set error1
error1_bool = pd.isnull(df['DATE1']) | pd.isnull(df['DATE2'])
df.loc[error1_bool, 'error1'] = "x"
# Set error2
df_exists = df.loc[~error1_bool, :].copy()
df_exists.loc[df_exists['DATE1'] > df_exists['DATE2'], 'error2'] = "x"
df.loc[~error1_bool, 'error2'] = df_exists['error2']
# Set correct where you haven't set error1 or error2
df.loc[df['error1'] != "x" & df['error2'] != "x", "correct"] = "x"