【问题标题】:pandas to_excel() ignore/allow duplicate column namespandas to_excel() 忽略/允许重复的列名
【发布时间】:2018-10-25 11:54:42
【问题描述】:

使用pandas的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()' 时忽略重复列名的任何帮助

【问题讨论】:

  • 你用的是什么版本的熊猫?
  • @Chris pd.__version__ 说,0.22.0

标签: python excel pandas


【解决方案1】:

@Ricky Aguilar 有一个很好的解决方案。我采用了他的解决方案,只是让它变得更加动态

现在您可以重命名所有重复的标题,甚至不知道它们的值是什么

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()

【讨论】:

  • 很好的答案,我有 >1000 列!
  • 谢谢@MartienLubberink ... > 1000 列...听起来很疯狂...但我刚刚看到您是会计学副教授...现在一切都说得通了。
  • 哈哈,lol,数据很宽,我不得不转换太长。借助 stack、unstack、set_index、reset_index 和 pivot,Pandas 非常出色地做到了这一点
【解决方案2】:

可以使用:

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

不过,它看起来不太好,因为我有 10 列要重命名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-26
    • 2020-08-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2019-01-22
    相关资源
    最近更新 更多