Панды to_excel () игнорировать / разрешать повторяющиеся имена столбцов - PullRequest
0 голосов
/ 15 мая 2018

Есть ли способ игнорировать повторяющиеся имена столбцов после использования функции панд to_excel ()?

Скажите, у меня есть old_wb.xlsx :

>> df1 = pd.read_excel('wb1.xlsx')
        ---------------------merged header--------------------
        col1    col2   col3   col1   col4   col1   col2   col5
        test    test   test   test   test   test   test   test

и, скажем, я обработал моего файла Excel, например, удалил объединенный заголовок и сохранил его в другом файле Excel:

>> df1.to_excel('new_wb.xlsx', 'Sheet1', merged_cells=False, header=None, index=False)

Имена столбцов new_wb.xlsx выглядят так:

        col1    col2   col3   col1.1   col4   col1.2   col2.1   col5
        test    test   test   test     test   test     test     test

Он добавил .1 к дублирующимся именам столбцов и также увеличивается по мере того, как дублируется имя столбца.

Я пытался переименовать имя столбца перед использованием to_excel(), но это не сработало. Кажется, переименование дубликатов происходит в to_excel().

>> df1.rename(columns=lambda x: x.replace('.1',''))

После поиска я нашел аргумент для to_excel(), который равен mangle_dupe_cols=False, к сожалению, он вернул:

ValueError: Setting mangle_dupe_cols=False is not supported yet

Любая помощь о том, как игнорировать повторяющиеся имена столбцов при сохранении `to_excel () '

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

@ Рикки Агилар имеет отличное решение. Я взял его решение и просто сделал его более динамическим .

Теперь вы можете переименовать все дубликаты заголовков, даже не зная, что их значения

def dataframe_allowing_duplicate_headers():
    # To Hold All The Possible Duplicate Tags ['.1', '.2', '.3', ...]
    dup_id_range = []

    # Load Your Excel File Using Pandas
    dataframe = pandas.read_excel("path_to_excel_file", sheet_name="sheetname")

    # Generate And Store All The Possible Duplicate Tags ['.1', '.2', '.3', ...]
    for count in range(0, len(dataframe.columns)):
        dup_id_range.append( '.{}'.format(count) )

    # Search And Replace All Duplicate Headers To What It Was Set As Originally
    def rename(dataframe, character_number):
        duplicate_columns_chars = list(
            filter(lambda v: v[(len(v)-character_number):] in dup_id_range,
            dataframe.columns))

        for duplicate_column in duplicate_columns_chars:
            dataframe = dataframe.rename(
                columns={duplicate_column:duplicate_column[:-character_number]})
        return dataframe


    # Replace The Possible Duplicates Respectfully Based On Columns Count
    if len(dup_id_range) > 0:
        dataframe = rename(dataframe, 2)
        if len(dup_id_range) > 9:
            dataframe = rename(dataframe, 3)
            if len(dup_id_range) > 99:
                dataframe = rename(dataframe, 4)
                # If You Have More Than A Thousand Columns (lol)
                #if len(dup_id_range) > 999:
                #    dataframe = rename(dataframe, 5)

    return dataframe

ИСПОЛЬЗОВАНИЕ:

# This Dataframe Will Have All Your Headers, Allowing Your Duplicates
my_dataframe = dataframe_allowing_duplicate_headers()
0 голосов
/ 15 мая 2018

Это работает, используя:

df1.rename(columns={'old_name':'new_name'})

Хотя, это не выглядит хорошо, так как у меня есть 10 столбцов для переименования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...