Python 转置数据和拆分列

Python 转置数据和拆分列,python,pandas,Python,Pandas,我有这个示例dataframe,常规dataframe有大约35个不同的列,有更多的类别/子类别 id drink_bottle drink_can food_napkin food_wrapper location 1 5 5 2 6 ma

我有这个示例dataframe,常规dataframe有大约35个不同的列,有更多的类别/子类别

id  drink_bottle  drink_can  food_napkin  food_wrapper      location
                                                                 
1              5          5            2             6          mall
2              2          4            3             1          mall
3              7          2            0             1          mall
4              0          3            9             2         urban
5              3          1            4             4         urban
6              2          4            5             3         urban
7              2          1            4             3         urban
8              7          1            2             0         urban
9              0          2            3             9         urban
10             3          4            4             4  recreational
11             2          3            5             5  recreational
12             5          1            0             3  recreational
我想把它转换成这个

id category subcategory  amount location
                                      
1     drink      bottle       5     mall
1     drink         can       5     mall
1      food      napkin       2     mall
1      food     wrapper       6     mall
2     drink      bottle       2     mall
2     drink         can       4     mall
2      food      napkin       3     mall
2      food     wrapper       1     mall
3     drink      bottle       3     mall
3     drink         can       4     mall
3      food      napkin       5     mall
3      food     wrapper       7     mall
4     drink      bottle       1    urban
4     drink         can       4    urban
4      food      napkin       2    urban
4      food     wrapper       1    urban
我尝试过不同的方法,比如转置函数和使用字符串的一部分来添加值。但我真的不知道,解决这样的问题最好的办法是什么。由于我不知道如何重新排列它,它还需要被缩放以防添加新列。有人能把我推向正确的方向吗

d={'drink_bottle': {1: 5, 2: 2, 3: 7, 4: 0},
 'drink_can': {1: 5, 2: 4, 3: 2, 4: 3},
 'food_napkin': {1: 2, 2: 3, 3: 0, 4: 9},
 'food_wrapper': {1: 6, 2: 1, 3: 1, 4: 2},
 'location': {1: 'mall', 2: 'mall', 3: 'mall', 4: 'urban'},
 'id': {1: 1, 2: 2, 3: 3, 4: 4}}

df = pd.DataFrame(data=d)

您可以将具有
\uuuu
的非列名称转换为索引依据,然后按拆分列和按两个级别重新塑造列的形状:

df1 = df.set_index(['id','location'])
df1.columns = df1.columns.str.split('_', expand=True)
df1 = (df1.rename_axis(['category', 'subcategory'], axis=1)
          .stack([0,1])
          .reset_index(name='amount'))
print (df1)
    id location category subcategory  amount
0    1     mall    drink      bottle     5.0
1    1     mall    drink         can     5.0
2    1     mall     food      napkin     2.0
3    1     mall     food     wrapper     6.0
4    2     mall    drink      bottle     2.0
5    2     mall    drink         can     4.0
6    2     mall     food      napkin     3.0
7    2     mall     food     wrapper     1.0
8    3     mall    drink      bottle     7.0
9    3     mall    drink         can     2.0
10   3     mall     food      napkin     0.0
11   3     mall     food     wrapper     1.0
12   4    urban    drink      bottle     0.0
13   4    urban    drink         can     3.0
14   4    urban     food      napkin     9.0
15   4    urban     food     wrapper     2.0

这个解决方案是如此简单,让我感到惊讶,我写了多行代码,几乎不象这样。从未想过使用多索引和堆栈