Python 熊猫将多个组融为一列

Python 熊猫将多个组融为一列,python,pandas,dataframe,transpose,melt,Python,Pandas,Dataframe,Transpose,Melt,原始数据帧: +----+----------+----------+----------+----------+ | ID | var1hrs | var2hrs | ind1var | ind2var | +----+----------+----------+----------+----------+ | 1 | 55 | 45 | 123 | 456 | | 2 | 48 | 60 | 331 |

原始数据帧:

+----+----------+----------+----------+----------+
| ID |  var1hrs |  var2hrs |  ind1var |  ind2var |
+----+----------+----------+----------+----------+
|  1 |       55 |       45 |      123 |      456 |
|  2 |       48 |       60 |      331 |      222 |
+----+----------+----------+----------+----------+
+----+------------+------+------+
| ID |    type    |  hrs |  ind |
+----+------------+------+------+
|  1 |  primary   |   55 |  123 |
|  1 |  secondary |   45 |  456 |
|  2 |  primary   |   48 |  331 |
|  2 |  secondary |   60 |  222 |
+----+------------+------+------+
目标数据帧:

+----+----------+----------+----------+----------+
| ID |  var1hrs |  var2hrs |  ind1var |  ind2var |
+----+----------+----------+----------+----------+
|  1 |       55 |       45 |      123 |      456 |
|  2 |       48 |       60 |      331 |      222 |
+----+----------+----------+----------+----------+
+----+------------+------+------+
| ID |    type    |  hrs |  ind |
+----+------------+------+------+
|  1 |  primary   |   55 |  123 |
|  1 |  secondary |   45 |  456 |
|  2 |  primary   |   48 |  331 |
|  2 |  secondary |   60 |  222 |
+----+------------+------+------+

我如何将多组变量融合到一个标签列中?变量名称中的“1”表示type=“primary”,而“2”表示type=“secondary”

修改列名称后,我们可以使用
wide\u to\u long

df.columns=df.columns.str[:4]
s=pd.wide_to_long(df,['var','ind'],i='ID',j='type').reset_index()
s=s.assign(type=s.type.map({'1':'primary','2':'secondary'})).sort_values('ID')
s

   ID       type  var  ind
0   1    primary   55  123
2   1  secondary   45  456
1   2    primary   48  331
3   2  secondary   60  222
(评论内联)


这或多或少是一种有效的方法,即使步骤有点复杂。

到目前为止您尝试了什么?我很惊讶文档对这些函数的影响如此之大。。。这似乎很有用。@coldspeed同意!解释不清楚,很长一段时间以来,我一直在努力解决
后缀问题,我也很难弄清楚如何使用该函数!如果将“ind1var”和“ind2var”分别命名为“var1ind”和“var2ind”,您会怎么做?用[:4]切片所有列将导致重复的列名。@jerbear这是一个棘手的问题
pd.wide\u-long(df,['var1','var2'],i='ID',j='drop',后缀='\w+')。取消堆栈(-2)。T
但您可以这样做