开发者社区> 问答> 正文

使用 Pandas Melting

问题

我是Python的新手,正在尝试将表转换为所需的输出。

可复制的数据

我有这张桌子,我正在尝试将其转换为预计的输出。

pd.DataFrame({'A': ['1.Food', '1.1Bread', '1.2Chicken', 'Car', 'Animal', 'Ball'], 'Val1': [10, 14, 94, 13, 49, 89], 'Val2': [1,2,3,4,5,6], 'Val3' : [100, 120, 130, 140, 150, 160]}, 
                  columns=['A', 'Val1', 'Val2', 'Val3'])


    A         Val1 Val2 Val3
0   1.Food      10  1   100
1   1.1Bread    14  2   120
2   1.2Chicken  94  3   130
3   Car         13  4   140
4   Animal      49  5   150
5   Ball        89  6   160

预计输出

有人可以跟我分享如何正确地进行调整吗?谢谢!

更新

我使用过melt,它以某种方式创建了我想要的东西,但是我仍然无法获得我的子类别。

t1.melt(id_vars = ['A'])




      A     variable    value
0   1.Food  Val1         10
1   1.1Bread    Val1    14
2   1.2Chicken  Val1    94
3   Car     Val1        13
4   Animal  Val1        49
5   Ball    Val1        89
6   1.Food  Val2        1
7   1.1Bread    Val2    2
8   1.2Chicken  Val2    3
9   Car     Val2        4
10  Animal  Val2        5
11  Ball    Val2        6
12  1.Food  Val3        100
13  1.1Bread    Val3    120
14  1.2Chicken  Val3    130
15  Car     Val3        140
16  Animal  Val3        150
17  Ball    Val3        160

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 12:21:55 399 0
1 条回答
写回答
取消 提交回答
  • 我找不到真正直接的方法,所以我一步一步地做到了:

    • identify a numerical category from the number before a dot in column A
    • extract a SubCategory when column A contains 2 numbers separated with a dot
    • build a Category column
      • use column A if SubCategory is NaN
      • use a groupby with the numerical category to fill the Category column

    完成此操作后,将通过一个简单的堆栈给出结果。代码可以是:

    df = pd.DataFrame({'A': ['1.Food', '1.1Bread', '1.2Chicken', 'Car', 'Animal', 'Ball'], 'Val1': [10, 14, 94, 13, 49, 89], 'Val2': [1,2,3,4,5,6], 'Val3' : [100, 120, 130, 140, 150, 160]},
                      columns=['A', 'Val1', 'Val2', 'Val3'])
    
    df['Categ'] = df['A'].str.extract(r'^(\d+)\.')
    df['SubCategory'] = df['A'].str.extract(r'^(\d+\.\d+.\*')
    df.loc[df['SubCategory'].isna(),'Category'] = df.loc[
        df['SubCategory'].isna(),'A']
    
    df.loc[~ df['Categ'].isna(), 'Category'] = df[~ df['Categ'].isna()].groupby(
        'Categ')['Category'].apply(lambda x: x.bfill().ffill())
    
    resul = df.set_index(['Category','SubCategory'])[
        ['Val1', 'Val2', 'Val3']].stack().reset_index().rename(
            columns={'level_2': 'ValueType', 0: 'Value'})
    

    它给出了预期的结果:

       Category SubCategory ValueType  Value
    0    1.Food         NaN      Val1     10
    1    1.Food         NaN      Val2      1
    2    1.Food         NaN      Val3    100
    3    1.Food    1.1Bread      Val1     14
    4    1.Food    1.1Bread      Val2      2
    5    1.Food    1.1Bread      Val3    120
    6    1.Food  1.2Chicken      Val1     94
    7    1.Food  1.2Chicken      Val2      3
    8    1.Food  1.2Chicken      Val3    130
    9       Car         NaN      Val1     13
    10      Car         NaN      Val2      4
    11      Car         NaN      Val3    140
    12   Animal         NaN      Val1     49
    13   Animal         NaN      Val2      5
    14   Animal         NaN      Val3    150
    15     Ball         NaN      Val1     89
    16     Ball         NaN      Val2      6
    17     Ball         NaN      Val3    160
    

    回答来源:stackoverflow

    2020-03-24 12:22:03
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
即学即用的Pandas入门与时间序列分析 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载