【问题标题】:How to rename a subset of columns based on offset/index and variable range?如何根据偏移量/索引和变量范围重命名列的子集?
【发布时间】:2022-01-22 22:25:14
【问题描述】:

我正在处理学生测试数据。提供的数据采用新格式,我需要将其与现有 BI 应用程序的旧格式对齐。在一系列列用于包含问题编号的情况下,列名现在包含正确答案(这包括从源 XLSX 导入的重复列名 - 请参见下图)。不同年级有不同数量的问题(因此“总计”列不固定。我需要将答案列重命名为从 1 开始的连续问题编号。实现此目的的最佳方法是什么?

NB 示例 df 不太正确,因为列名代表正确答案,因此列名重复。如果不从 CSV/XLSX 导入,我无法提供示例 df。

更新了一些示例 df 数据:

data = {
        'StudentID': [10, 11, 12, 13],
        'Year' : [2021,2021,2021,2021],
        'TestName': ['Math83', 'Math83','Math83','Math83'],
        'A' : ['C','A','C','B'],
        'B' : ['D','C','C','C'],
        'C' : ['D','D','C','D'],
        'D' : ['B','C','C','C'],
        'Total': [5,4,3,5,],
        'Score': [3,3,4,2,],
        'Error': [1,2,1,1]
        }
df = pd.DataFrame(data)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是使用set_axis()的解决方案

    cols = df.columns
    tn = cols.get_loc('TestName')+1
    total = cols.get_loc('Total')
    
    (df.set_axis(cols[:tn].tolist() + 
                 list(range(1,len(df.columns[tn:total+1]))) + 
                 cols[total:].tolist(),axis=1))
    

    输出:

       StudentID  Year TestName  1  2  3  4  Total  Score  Error
    0         10  2021   Math83  C  D  D  B      5      3      1
    1         11  2021   Math83  A  C  D  C      4      3      2
    2         12  2021   Math83  C  C  C  C      3      4      1
    3         13  2021   Math83  B  C  D  C      5      2      1
    

    【讨论】:

    • 问题是列数不固定,所以[3:9] 并不适用于所有情况。
    • 刚刚使用get_loc()编辑
    • 感谢 rhug123,枚举工作得很好(以前从未使用过),但整行返回 {NameError}name 'df' is not defined。我认为这是由重复的列名引起的。有关如何解决此问题的任何建议?
    • 我相信我已经更新了解决这个问题的解决方案
    • 纯粹的天才。工作一种享受。
    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2017-01-13
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多