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,但现在它没有实现.也许在一些新版本的熊猫中.然后我的答案会更新.