Как объединить несколько листов Excel с разными столбцами таблицы в Python? - PullRequest
1 голос
/ 13 июня 2019

У меня есть несколько листов Excel с другим столбцом:

Таблица A: Col1 Col2 Col3

Таблица B: Col2 Col4 Col5

Таблица C:Col1 Col6 Col7

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

Финальный стол: Col1 Col2 Col3 Col4 Col5 Col6 Col7

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

Это код, объединяющий два листа:

    import pandas as pd
    import numpy as np
    import glob
    df = pd.read_excel('C:/Users/Am/Downloads/sales-mar-2014.xlsx')
    status = pd.read_excel('C:/Users/Am/Downloads/customer-status.xlsx')
    all_data_st = pd.merge(df, status, how='outer') 
    all_data_st.to_excel('C:/Users/Am/Downloads/a1.xlsx',header=True)

Это кодя написал для объединения более двух листов:

    import pandas as pd
    import numpy as np
    import glob
    all_data = pd.DataFrame()
    for f in glob.glob(‘C:/Users/Am/Downloads/*.xlsx’):
    all_data = all_data.merge(pd.read_excel(f), how='outer')
    writer = pd.ExcelWriter('merged.xlsx', engine='xlsxwriter')
    all_data.to_excel(writer,sheet_name='Sheet1')
    writer.save()

Это ошибка, которую я получаю:

Traceback (most recent call last):
  File "E:/allfile.py", line 7, in <module>
    all_data = all_data.merge(pd.read_excel(f), how='outer')
  File "C:\Users\Am\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\core\frame.py", line 6868, in merge
    copy=copy, indicator=indicator, validate=validate)
  File "C:\Users\Am\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\core\reshape\merge.py", line 47, in merge
    validate=validate)
  File "C:\Users\Am\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\core\reshape\merge.py", line 524, in __init__
    self._validate_specification()
  File "C:\Users\Am\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\core\reshape\merge.py", line 1033, in _validate_specification
    lidx=self.left_index, ridx=self.right_index))
pandas.errors.MergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False

Ответы [ 2 ]

1 голос
/ 13 июня 2019

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

Вот пример кода:

import pandas as pd
data_A = pd.read_excel('a.xlsx')
data_B = pd.read_excel('b.xlsx')
data_C = pd.read_excel('c.xlsx')
print("File A Data:")
print(data_A)
print("File B Data:")
print(data_B)
print("File C Data:")
print(data_C)

data_AB = pd.merge(left=data_A, right=data_B, on='Col2', how='outer')
data_ABC = pd.merge(left=data_AB, right=data_C, on='Col1', how='outer')
print("Merged Data:")
print(data_ABC)

Выходными данными будут объединенные данные всех трех таблиц со всеми столбцами. Надеюсь, это поможет вам решить вашу проблему.

1 голос
/ 13 июня 2019

код для двух листов тоже не работает, верно? аргумент отсутствует, я бы порекомендовал сохранить различные типы листов Excel в новой папке, а затем создать один файл для каждого типа листов Excel на основе следующей справки: Загрузка нескольких CSV-файлов папки в один фрейм данных

тогда вы можете запустить слияние:

 all_data_st = pd.merge(A, B, how='outer', on='Col2')
 all_data_st = pd.merge(all_data_st, C, how='outer', on='Col1')

Альтернативно попробуйте запустить concat:

all_data = pd.DataFrame()
for f in glob.glob(‘C:/Users/Am/Downloads/*.xlsx’):
  df = pd.read_excel(f)
  all_data = pd.concat([all_data,df], axis=0, ignore_index=True)
...