Возможно легко исправить. Я хочу извлечь конкретную информацию из многих книг Excel в одном стиле в каталоге и объединить конкретную информацию в одну книгу (при изменении формата). Я выполнил каждую часть этой задачи, за исключением успешного создания одного большого фрейма данных из n столбцов из разных книг (пропорционально количеству прочитанных файлов xlsx). Каждая из прочитанных книг имеет только один лист ['Sheet1']. Это похоже на то, что я использую правильный подход? В настоящее время я использую цикл for для сбора этих данных.
После многочисленных исследований в Интернете (Github, youtube, stackoverflow) другие говорят, что нужно создать один большой фрейм данных, а затем объединить его. Я попытался использовать цикл for для создания этого фрейма данных; однако я не видел, чтобы пользователи «собирали вместе» биты данных, чтобы сформировать фрейм данных так, как я. Не думаю, что это должно мешать операции. Я понимаю, что не добавляю и не объединяю, просто не знаю, куда с этим идти.
for i in filepaths: #filepaths is a list of n filepaths`
df = pd.read_excel(i) #read the excel sheets`
info = otherslices #condensed form of added slices from df`
Final = pd.DataFrame(info) #expected big dataframe`
Ожидаемые результаты должны быть столбцами, расположенными непосредственно друг за другом (по одному от каждого листа Excel соответственно).
Excel1 Excel2 -> Excel(n)
info1a info1b
info2a info2b
info3a info3b
... ...
То, что я сейчас получаю при использовании «print (Final)» в цикле,
Excel1
info1a
info2a
info3a
...
Excel2
info1b
info2b
info3b
...
|
Excel(n)
Однако фрейм данных, который я получаю из этого цикла (когда я набираю «Final»), только самые последние данные книги excel
Я бы создал список фреймов данных, которые вы добавляете в каждый цикл, а затем после цикла объединяете список в один фрейм данных. Что-то вроде этого.
Final=[]
for i in filepaths: #filepaths is a list of n filepaths`
df = pd.read_excel(i) #read the excel sheets`
info = otherslices #condensed form of added slices from df`
Final.append(info) #expected big dataframe`'
Final=pd.concat(Final)
Это. Не могли бы вы ответить с точной ошибкой? Также для получения дополнительной информации об объединении кадров данных полезно использовать этот связь. Я предполагаю, что информационная переменная не является фреймом данных. Вы можете закомментировать строку pd.concate и посмотреть, что такое конечная переменная. Это должен быть список фреймов данных
TypeError: первый аргумент должен быть итерируемым объектом pandas, вы передали объект типа «DataFrame»
Отредактировал мой код, нужно изменить Final=append на Final.append
«Информация» для меня - это список, который я создал из фрагментов фрейма данных df. Возможно, мне следует сначала сделать это кадром данных?
Да конвертировать информацию в фрейм данных
на "Редактировал мой код..." Я понял, что вы имели в виду =)
Таким образом, каждый столбец DataFrame, с которым я работаю, состоит из 94 строк. Информация была изменена на фрейм данных, а concat был закомментирован. При вводе Final.shape вне цикла возвращается (190, 1), как будто он принимает два столбца данных (я думаю?). имейте в виду, что в приведенном мной примере пропущены части кода, которые, как мне кажется, не мешают зацикливанию (но могут?).
Сколько раз вы добавляете информацию. Если это 190, то (190,1) имеет смысл. Это связано с тем, что final теперь состоит из 190 кадров данных, которые находятся в 1 столбце. Вы пробовали это снова с раскомментированным concat?
В моем случае n=10, то есть у меня есть 10 разных столбцов данных, по 94 строки в каждом. Итак, я после 10 кадров данных (каждый 94x1). Когда я пытаюсь выполнить код с Final =pd.concat(Final), я снова получаю ошибку TypeError:.
Я нашел собственное решение этой проблемы.
Final = pd.DataFrame(index=range(95)) #95 is the number of rows I have for each column
n=0
for i in filepaths: #filepaths is a list of n filepaths
df = pd.read_excel(i) #read the excel sheets`
info = otherslices #condensed form of added slices from df`
Final[n]=pd.DataFrame(info)
n+=1
Final = Final.append(Final) #big dataframe of n columns
Final
Результат точно такой, как и ожидалось от моего исходного поста.
Обновление: «Final = Final.append(Final)» не требуется. это дублированные результаты
Спасибо за быстрый ответ. Я попробовал это и наткнулся на синтаксическую ошибку pd.concat, требующую итерации объектов pandas, а не DataFrame. Разве Dataframe не является объектом pandas?