недопустимое сравнение типов с логическими значениями в Pandas - PullRequest
0 голосов
/ 05 февраля 2019

Попытка очистить столбец Страна (Ctry) в кадре данных панд (источник) на основе других данных уровня строки или других кадров данных с аналогичными данными.См. Ссылки на примеры фреймов данных.

В конечном итоге он будет заполнен двумя новыми столбцами в фрейме данных, давая правильно отформатированную страну и "оценку" качества данных.

Исходный фрейм данных Нафта, страны и штаты DataFrames

Функция работает со значениями, которые находятся в таблицах поиска, или с пробелами, но когда я передаю "плохие" данные, она дает недопустимое сравнение типов.Тестирование этого отдельно возвращает логическое значение и работает:

Nafta.loc[Nafta[col] == a].empty .

Не уверен, почему это не работает.Я проверил значения, и его логическое значение к логическому.См. Пользовательскую функцию и лямбду.

def CountryScore(a,b,c): 
    if pd.isnull(a):
        score = "blank"
        if pd.notnull(b):
            for col in States:
                if States.loc[States[col]== b].empty != True:
                    corfor = States.iloc[States.loc[States[col] == b].index[-1],2]
                    break
                else:
                    corfor = "Bad Data"
                    continue
        elif pd.notnull(c):
            if (len(str(c).strip()) <= 5) or (len(str(c).strip()) > 9):
                corfor = "USA"
            else:
                corfor = "CAN"
        else:
            corfor = "Bad Data"
    else:
        for col in Nafta:
            if Nafta.loc[Nafta[col] == a].empty != True:
                score = "good" 
                corfor = Nafta.iloc[Nafta.loc[Nafta[col] == a].index[-1],1]
                break
            else:
                score = "pending"
                continue
    if  "pending" == score:
        for col in Country:
            if Country.loc[Country[col]== a].empty != True:
                score = "good"
                corfor = Country.iloc[Country.loc[Country[col] == a].index[-1],2]
                break
            else:
                score = "bad"
                corfor = "Bad Data"
                continue
    return score, corfor

origin["Origin Ctry Score"] , origin["Origin Ctry Format"] = zip(*origin.apply(lambda x: CountryScore(x["Origin Ctry"], x["Origin State"], x["Origin Zip"]), axis = 1))

Предположим, что кадры данных уже загружены.Спасибо !!!

1 Ответ

0 голосов
/ 05 февраля 2019

Я смог найти свою ошибку.В последнем столбце страны я сравниваю целое число со строкой.Не имеет ничего общего с логическим.Исправлено с помощью:

Country.loc[Country[col].astype(str)== a].empty != True

В результате я преобразую большинство в этот тип преобразования.

...