Чтобы найти место, в котором произошла ошибка - PullRequest
0 голосов
/ 06 октября 2019

Мне нужно сделать проверку данных для диапазона. Чтобы проверить, находятся ли значения столбца в заданном диапазоне, если значение больше или меньше, чем должна произойти ошибка данного диапазона, и отобразите номер строки или индекс, где произошла ошибка.

мои данные выглядят следующим образом:

Draft_Fore 12 14 87 16 90

Это должно привести к ошибке для значений 87 и 90, поскольку я считал, что диапазон столбца должен быть больше 5 и меньше 20.

Код, который я пробовал, выглядит следующим образом:

def validate_rating(Draft_Fore):
    Draft_Fore = int(Draft_Fore)
    if Draft_Fore > 5 and Draft_Fore <= 20:
       return True
    return False
df = pd.read_csv("/home/anu/Desktop/dr.csv")
for i, Draft_Fore in enumerate(df):
try:
    validate_rating(Draft_Fore)
except Exception as e: 
    print('Error at index {}: {!r}'.format(i, Draft_Fore))
    print(e)

Для печати местоположения, в котором произошла ошибка в строке

1 Ответ

0 голосов
/ 06 октября 2019

Небольшое объяснение, чтобы уточнить мой комментарий. Предполагая, что ваш dataframe выглядит как

df = pd.DataFrame({'col1': [12, 14, 87, 16, 90]})

, вы можете сделать

def check_in_range(v, lower_lim, upper_lim):
    if lower_lim < v <= upper_lim:
       return True
    return False

lower_lim, upper_lim = 5, 20
for i, v in enumerate(df['col1']):
    if not check_in_range(v, lower_lim, upper_lim):
        print(f"value {v} at index {i} is out of range!")

# --> gives you
value 87 at index 2 is out of range!
value 90 at index 4 is out of range!

Таким образом, ваша функция проверки в основном в порядке. Однако, если вы вызовете enumerate a df, значения будут именами столбцов. Вам нужно перечислить конкретный столбец.

Что касается вашей идеи вызвать исключение, я бы посоветовал взглянуть на повышение и утверждение .

Таким образом, вы можете, например, использовать raise:

for i, v in enumerate(df['col1']):
    if not check_in_range(v, lower_lim, upper_lim):
        raise ValueError(f"value {v} at index {i} is out of range")

# --> gives you
ValueError: value 87 at index 2 is out of range

или assert:

for i, v in enumerate(df['col1']):
    assert v > lower_lim and v <= upper_lim, f"value {v} at index {i} is out of range"

# --> gives you
AssertionError: value 87 at index 2 is out of range

Примечание: Если у вас есть df, почему бы не использовать его функции для удобства? Чтобы получить значения в диапазоне столбца, вы можете просто сделать

df[(df['col1'] > lower_lim) & (df['col1'] <= upper_lim)]

# --> gives you
   col1
0    12
1    14
3    16
...