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

python-重塑,透视,取消堆叠-多索引

  •  1
  • chitown88  · 技术社区  · 6 年前

    我在下面有一个数据框架,我正在努力重塑它。我已经找到了如何做的方法,但是我得到了多个答案,当尝试实现获取错误时,因为有重复的索引,或者我只得到一个宽行的数据帧。我一直在尝试的选项是unstack、pivot和ravel。在不迭代行的情况下,什么是最好和最简单的重塑方法?我知道我可以解决这个问题,但我也知道有更好的方法。

    为了清晰起见,我提供了一个屏幕截图,展示了我所拥有的以及我正在尝试做的事情:

    这是我的(但有几千排)

    我试图将具有相同客户、周和类型的行移到一行中:

    看起来像这样:

    编辑:按照下面的要求,只是一个数据集的快速样本。我应该从一开始就提供。

    导入熊猫为pd D='客户':['store_a']*12, 'class':['1a'、'1a'、'2b'、'2b'、'3c'、'3c']*2, '周':['08/19/2018','08/26/2018']*6, '类型':['食物']*6+['饮料']*6, '值':[无,无,1,1.5,1.1,1.2,无,无,0.96,0.70,0.96,0.96] 测试数据框(数据=d) < /代码>

    为了清晰起见,我提供了一个屏幕截图,显示了我所拥有的以及我正在尝试做的事情:

    这是我的东西(但有几千排)

    enter image description here

    我试图将具有相同客户、周和类型的行移到一行中:

    enter image description here

    看起来像这样:

    enter image description here

    编辑:按照下面的要求,只是一个数据集的快速样本。我应该从一开始就提供。

    import pandas as pd
    
    d = {'Customer': ['Store_A']*12,
     'Class': ['1A','1A','2B','2B','3C','3C']*2,
     'Week':['08/19/2018','08/26/2018']*6, 
     'Type':['Food']*6 + ['Beverage']*6, 
     'Value': [None,None,1,1.5,1.1,1.2,None,None,0.96,0.70,0.96,0.96]}
    
    test_df = pd.DataFrame(data=d)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    您可以避免在pandas中出现重复的列名称,因此我建议为其添加计数器:

    g = test_df.groupby(['Customer','Week', 'Type']).cumcount().astype(str)
    
    df = test_df.set_index(['Customer','Week', 'Type', g]).unstack().sort_index(axis=1, level=1)
    df.columns = df.columns.map('_'.join)
    
    df = df.reset_index()
    print (df)
      Customer        Week      Type Class_0  Value_0 Class_1  Value_1 Class_2  \
    0  Store_A  08/19/2018  Beverage      1A      NaN      2B     0.96      3C   
    1  Store_A  08/19/2018      Food      1A      NaN      2B     1.00      3C   
    2  Store_A  08/26/2018  Beverage      1A      NaN      2B     0.70      3C   
    3  Store_A  08/26/2018      Food      1A      NaN      2B     1.50      3C   
    
       Value_2  
    0     0.96  
    1     1.10  
    2     0.96  
    3     1.20