Search code examples
pythonpandasseriesvalueerror

For Loop and The truth value of a Series is ambiguous


Looked through the answers to similar queries here but still unsure. Code below produces:

     for i in range(len(df)):
            if df[0]['SubconPartNumber1'].str.isdigit() == False :
                df['SubconPartNumber1'] = df['SubconPartNumber1'].str.replace(',', '/', regex = True)
                df['SubconPartNumber1'] = df['SubconPartNumber1'].str.replace(r"\(.*\)-", '/', regex = True)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Solution

  • In pandas you can avoid loops if possible. Your solution should be replace by boolean mask with ~ for invert instead == False and passed to DataFrame.loc:

    m = df['SubconPartNumber1'].str.isdigit()
    df.loc[~m, 'SubconPartNumber1'] = df.loc[~m, 'SubconPartNumber1'].str.replace(',', '/', regex = True).str.replace(r"\(.*\)-", '/', regex = True)
    

    But because numeric has only numbers I think mask is not necessary here, also regex should be join by | for or, regex=True is default parameter, so should be omitted:

    df = pd.DataFrame({'SubconPartNumber1':['345','aaa,','(bbb)-ccc']})
    print (df)
      SubconPartNumber1
    0               345
    1              aaa,
    2         (bbb)-ccc
    
    df['SubconPartNumber1'] = df['SubconPartNumber1'].str.replace(r",|\(.*\)-", '/')
    print (df)
      SubconPartNumber1
    0               345
    1              aaa/
    2              /ccc