融化pandas数据框,具有多个变量名和多个值名

ow*_*ise 11 python melt pandas

如何使用多个变量名称和值来融合pandas数据框?我有以下数据框,在for循环中更改其形状.在其中一个for循环迭代中,它看起来像这样:

ID  Cat    Class_A   Class_B     Prob_A     Prob_B
1   Veg      1        2          0.9         0.1
2   Veg      1        2          0.8         0.2
3   Meat     1        2          0.6         0.4
4   Meat     1        2          0.3         0.7
5   Veg      1        2          0.2         0.8
Run Code Online (Sandbox Code Playgroud)

我需要以这样的方式融化它:

ID  Cat    Class     Prob    
1   Veg      1       0.9       
1   Veg      2       0.1
2   Veg      1       0.8        
2   Veg      2       0.2
3   Meat     1       0.6         
3   Meat     2       0.4
4   Meat     1       0.3         
4   Meat     2       0.7
5   Veg      1       0.2         
5   Veg      2       0.8
Run Code Online (Sandbox Code Playgroud)

在for循环期间,数据帧将包含具有其概率的不同数量的类.这就是为什么我正在寻找适用于所有for循环迭代的一般方法.我看到了这个问题,并且这个,但他们是没有帮助的!

jez*_*ael 12

你需要lreshape通过dict对指定类型:

d = {'Class':['Class_A', 'Class_B'], 'Prob':['Prob_A','Prob_B']}
df = pd.lreshape(df,d)
print (df)
    Cat  ID  Class  Prob
0   Veg   1      1   0.9
1   Veg   2      1   0.8
2  Meat   3      1   0.6
3  Meat   4      1   0.3
4   Veg   5      1   0.2
5   Veg   1      2   0.1
6   Veg   2      2   0.2
7  Meat   3      2   0.4
8  Meat   4      2   0.7
9   Veg   5      2   0.8
Run Code Online (Sandbox Code Playgroud)

更动态的解决方案

Class = [col for col in df.columns if col.startswith('Class')]
Prob = [col for col in df.columns if col.startswith('Prob')]
df = pd.lreshape(df, {'Class':Class, 'Prob':Prob})
print (df)
    Cat  ID  Class  Prob
0   Veg   1      1   0.9
1   Veg   2      1   0.8
2  Meat   3      1   0.6
3  Meat   4      1   0.3
4   Veg   5      1   0.2
5   Veg   1      2   0.1
6   Veg   2      2   0.2
7  Meat   3      2   0.4
8  Meat   4      2   0.7
9   Veg   5      2   0.8
Run Code Online (Sandbox Code Playgroud)

编辑:

lreshape现在没有文档记录,但将来可能会删除(也可以使用pd.wide_to_long).

可能的解决方案是将所有3个函数合并为一个 - 也许melt,但现在它没有实现.也许在一些新版本的熊猫中.然后我的答案会更新.