代码之家  ›  专栏  ›  技术社区  ›  Lynn

执行逐行反聚合(Pandas)更新时,难以将字段名称转换为特定值

  •  0
  • Lynn  · 技术社区  · 2 年前

    我有一个数据集,在那里我想将特定的字段名转换为值,同时将值反聚合为它们自己的唯一行,并执行长数据透视。

    数据

    # create DataFrame
    data = {
        "Start": ['8/1/2013', '8/1/2013'],
        "Date": ['9/1/2013', '9/1/2013'],
        "End": ['10/1/2013', '10/1/2013'],
        "Area": ['NY', 'CA'],
        "Final": ['3/1/2023', '3/1/2023'],
        "Type": ['CC', 'AA'],
        "Middle Stat": [226, 130],
        "Low Stat": [20, 50],
        "High Stat": [10, 0],
        "Middle Stat1": [0, 0],
        "Low Stat1": [0, 0],
        "High Stat1": [0, 0],
        "Re": [0,0],
        "Set": [0,0],
        "Set2": [0,0],
        "Set3": [0,0],
    
    }
    

    渴望的

    data = {'Start': ['8/1/2013', '8/1/2013', '8/1/2013', '8/1/2013', '8/1/2013', '8/1/2013'],
            'Date': ['9/1/2013', '9/1/2013', '9/1/2013', '9/1/2013', '9/1/2013', '9/1/2013'],
            'End': ['10/1/2013', '10/1/2013', '10/1/2013', '10/1/2013', '10/1/2013', '10/1/2013'],
            'Area': ['NY', 'CA', 'NY', 'CA', 'NY', 'CA'],
            'Final': ['3/1/2023', '3/1/2023', '3/1/2023', '3/1/2023', '3/1/2023', '3/1/2023'],
            'Type': ['CC', 'AA', 'CC', 'AA', 'CC', 'AA'],
            'Stat': [20, 50, 226, 130, 10, 0],
            'Range': ['Low', 'Low', 'Middle', 'Middle', 'High', 'High'],
            'Stat1': [0, 0, 0, 0, 0, 0],
            'Re': [0, 0, 0, 0, 0, 0],
            'Set': [0, 0, 0, 0, 0, 0],
            'Set2': [0, 0, 0, 0, 0, 0],
            'Set3': [0, 0, 0, 0, 0, 0]
            }
    

    正在执行

    我使用的是SO成员提供的这个很棒的脚本,但关于如何调整它以创建所需输出的疑难解答。我需要包括所需输出中显示的所有列。

    import janitor
    
    (df
    .pivot_longer(
        index = slice('Start', 'Type'), 
        names_to = ("Range", ".value"), 
        names_sep = " ")
    )
    

    欢迎提出任何建议。

    1 回复  |  直到 2 年前
        1
  •  3
  •   sammywemmy    2 年前

    一个选项是 pivot_longer 从…起 pyjanitor -在这种情况下,我们使用特殊的占位符 .value 以确定列中我们希望保留为标题的部分,而其余部分则被整理到一个新列中:

    # pip install pyjanitor
    import pandas as pd
    import janitor
    
    (df
    .pivot_longer(
        index = [slice('Start', 'Type'), slice('Re', 'Set3')], 
        names_to = ("Range", ".value"), 
        names_sep = " ")
    )
    
          Start      Date        End Area     Final Type  Re  Set  Set2  Set3   Range  Stat  Stat1
    0  8/1/2013  9/1/2013  10/1/2013   NY  3/1/2023   CC   0    0     0     0  Middle   226      0
    1  8/1/2013  9/1/2013  10/1/2013   CA  3/1/2023   AA   0    0     0     0  Middle   130      0
    2  8/1/2013  9/1/2013  10/1/2013   NY  3/1/2023   CC   0    0     0     0     Low    20      0
    3  8/1/2013  9/1/2013  10/1/2013   CA  3/1/2023   AA   0    0     0     0     Low    50      0
    4  8/1/2013  9/1/2013  10/1/2013   NY  3/1/2023   CC   0    0     0     0    High    10      0
    5  8/1/2013  9/1/2013  10/1/2013   CA  3/1/2023   AA   0    0     0     0    High     0      0