Как создать один большой фрейм данных с определенной информацией excel, используя python pandas из списка путей excel

Возможно легко исправить. Я хочу извлечь конкретную информацию из многих книг 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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
134
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы создал список фреймов данных, которые вы добавляете в каждый цикл, а затем после цикла объединяете список в один фрейм данных. Что-то вроде этого.

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.concat, требующую итерации объектов pandas, а не DataFrame. Разве Dataframe не является объектом pandas?

fwench_toast 09.04.2019 16:00

Это. Не могли бы вы ответить с точной ошибкой? Также для получения дополнительной информации об объединении кадров данных полезно использовать этот связь. Я предполагаю, что информационная переменная не является фреймом данных. Вы можете закомментировать строку pd.concate и посмотреть, что такое конечная переменная. Это должен быть список фреймов данных

AG-W 09.04.2019 16:06

TypeError: первый аргумент должен быть итерируемым объектом pandas, вы передали объект типа «DataFrame»

fwench_toast 09.04.2019 16:09

Отредактировал мой код, нужно изменить Final=append на Final.append

AG-W 09.04.2019 16:11

«Информация» для меня - это список, который я создал из фрагментов фрейма данных df. Возможно, мне следует сначала сделать это кадром данных?

fwench_toast 09.04.2019 16:13

Да конвертировать информацию в фрейм данных

AG-W 09.04.2019 16:14

на "Редактировал мой код..." Я понял, что вы имели в виду =)

fwench_toast 09.04.2019 16:15

Таким образом, каждый столбец DataFrame, с которым я работаю, состоит из 94 строк. Информация была изменена на фрейм данных, а concat был закомментирован. При вводе Final.shape вне цикла возвращается (190, 1), как будто он принимает два столбца данных (я думаю?). имейте в виду, что в приведенном мной примере пропущены части кода, которые, как мне кажется, не мешают зацикливанию (но могут?).

fwench_toast 09.04.2019 16:28

Сколько раз вы добавляете информацию. Если это 190, то (190,1) имеет смысл. Это связано с тем, что final теперь состоит из 190 кадров данных, которые находятся в 1 столбце. Вы пробовали это снова с раскомментированным concat?

AG-W 09.04.2019 16:33

В моем случае n=10, то есть у меня есть 10 разных столбцов данных, по 94 строки в каждом. Итак, я после 10 кадров данных (каждый 94x1). Когда я пытаюсь выполнить код с Final =pd.concat(Final), я снова получаю ошибку TypeError:.

fwench_toast 09.04.2019 16:41
Ответ принят как подходящий

Я нашел собственное решение этой проблемы.

    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

Результат точно такой, как и ожидалось от моего исходного поста.

fwench_toast 15.04.2019 22:07

Обновление: «Final = Final.append(Final)» не требуется. это дублированные результаты

fwench_toast 17.04.2019 13:41

Другие вопросы по теме