Ошибка типа: ожидаемый str, байты или os.Объект, подобный пути, а не фрейм данных — не перепечатка

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

На другую версию этого вопроса никогда не было ответа, оригинальный плакат не давал полного примера их кода…

У меня есть функция, предназначенная для импорта электронной таблицы для целей форматирования. Теперь электронная таблица может иметь две формы:

  1. Как строка имени файла (excel, .csv и т. Д.), Которая будет импортирована как фрейм данных
  2. Непосредственно как фрейм данных (есть еще одна функция, которая может вызываться или не вызываться для выполнения некоторой предварительной обработки)

код выглядит так

 def func1(spreadsheet):
    if type(spreadsheet) == pd.DataFrame: 
        df = spreadsheet
    else:
        df_ext = os.path.splitext(spreadsheet)[1]
        etc. etc.
  

Если я запускаю эту функцию с фреймом данных, я получаю следующую ошибку:

 ---> 67     if type(spreadsheet) == pd.DataFrame: df = spreadsheet
     68     else:

/opt/anaconda3/lib/python3.7/posixpath.py in splitext(p)
    120 
    121 def splitext(p):
--> 122     p = os.fspath(p)
    123     if isinstance(p, bytes):
    124         sep = b'/'

TypeError: expected str, bytes or os.PathLike object, not DataFrame
  

Почему он это делает?

Комментарии:

1. Итак, в этом случае, почему бы вам просто не проверить, является ли ввод в электронную таблицу a string (в случае, если это путь к файлу), а затем прочитать фрейм данных в условии else

2. Я пробовал это. Он выдал ту же ошибку…

Ответ №1:

Итак, один из способов — просто сравнить со строкой и прочитать фрейм данных в состоянии else. Другим способом было бы использовать isinstance

 In [21]: dict1
Out[21]: {'a': [1, 2, 3, 4], 'b': [2, 4, 6, 7], 'c': [2, 3, 4, 5]}

In [24]: df = pd.DataFrame(dict1)

In [28]: isinstance(df, pd.DataFrame)
Out[28]: True

In [30]: isinstance(os.getcwd(), pd.DataFrame)
Out[30]: False

  

Итак, в вашем случае просто сделайте это

 if isinstance(spreadsheet, pd.DataFrame)
  

Комментарии:

1. Я попытался переключить оператор if на ‘if type (spreadsheet) == str: …’, но он выдал точно такую же ошибку!!

2. Он выдает ошибку, даже если я просто пытаюсь ‘print (type (spreadsheet))’, чтобы посмотреть, что происходит

Ответ №2:

Проблема в этой строке:

 if type(spreadsheet) == pd.DataFrame: 
  

Тип pandas.core.frame.DataFrame фрейма данных . pandas .DataFrame — это класс, который возвращает фрейм данных при его вызове.

Любой из них будет работать:

 if type(spreadsheet) == type(pd.DataFrame()):


if type(spreadsheet) == pd.core.frame.DataFrame:
  

Комментарии:

1. Если я выполняю ‘type (spreadsheet) == pd.DataFrame’ вне функции, он возвращает True . Я попытался исправить, но он вернул ту же ошибку