使用列名将列聚合为行

时间:2019-08-01 09:41:06

标签: python pandas

我有以下数据框

df = pd.DataFrame({'ID':[1,2,3],'Q8_4_1':[1,2,3], 'Q8_5_1':[2,5,7],'Q8_4_2':[6,7,8], 'Q8_5_2':[9,10,11]})

enter image description here

这些列仅对不同的文件表示相同的变量。这样,结构如下Q8_4_(文件1),Q8_4_(文件2)等等。我想将数据框转换为以下表示形式:

enter image description here

当前,我正在运行一个不太理想的解决方案,其中涉及对列索引进行硬编码并按file_id拆分数据帧,如下所示:

df1 = df.iloc[:,:3]
df1.columns = ["ID","Q8_4","Q_5"]
df1["File_ID"] = 1

df2 = df.iloc[:,3:]
df2["ID"] = df["ID"]
df2.columns = ["ID","Q8_4","Q_5"]
df2["File_ID"] = 2

pd.concat([df1,df2],axis=0)

是否有任何熊猫功能可以帮助我实现可扩展的水平?

2 个答案:

答案 0 :(得分:3)

'If further information is needed, don´t hesitate to contact us. Kind regards, José Ramirez'

答案 1 :(得分:1)

groupbyaxis=1上使用concat的另一种方法:

col=df.columns[1:].str.rsplit('_',1).str[0]

final=pd.concat([g.stack().droplevel(1) for _,g in 
               df.set_index('ID').groupby(col,axis=1)],axis=1,keys=col).reset_index()
final=final.assign(File_ID=final.groupby('ID').cumcount()+1)
print(final)

   ID  Q8_4  Q8_5  File_ID
0   1     1     2        1
1   1     6     9        2
2   2     2     5        1
3   2     7    10        2
4   3     3     7        1
5   3     8    11        2