在熊猫中向量化字符串比较

时间:2019-07-26 14:15:20

标签: python pandas string-comparison

我目前正在使用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().

1 个答案:

答案 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"
相关问题