【问题标题】:Vectorizing String comparison in PandasPandas 中的向量化字符串比较
【发布时间】:2019-07-26 14:15:20
【问题描述】:

我目前正在使用 python pandas 来自动化 excel 操作,并且在处理较大的 excel 文件时遇到了一些速度问题。现在我尝试逐步优化。

我的脚本的第二步创建了 3 个新列:error1、error2 或正确。 如果 DATE2 中没有信息 (NaN),则只有 error1 的值应为“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().

【问题讨论】:

    标签: python pandas string-comparison


    【解决方案1】:

    说实话,我不知道你为什么要这样做,但你去吧

    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"
    

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多