使用熊猫重新排列具有相同列标题的数据框单元格

时间:2018-09-26 13:02:52

标签: python excel pandas

我有这个df文件,我是使用pandas.read_excel()从excel文件中读取的:

ID  A   B   C   A   B   C   A   B   C
10  a1  b1  c1  a4  b4  c4  a7  b7  c7
20  a2  b2  c2  a5  b5  c5  a8  b8  c8
30  a3  b3  c3  a6  b6  c6  a9  b9  c9

如何更改它以使其具有df_1:

ID   A   B   C     
10   a1  b1  c1    
20   a2  b2  c2    
30   a3  b3  c3    
10   a4  b4  c4
20   a5  b5  c5
30   a6  b6  c6
10   a7  b7  c7
20   a8  b8  c8
30   a9  b9  c9

2 个答案:

答案 0 :(得分:2)

您可以在列中创建MultiIndex,以通过cumcount来计数重复的列名称,然后可以通过stack进行重塑,最后通过reset_index进行一些数据清理:

df = df.set_index('ID')
s = df.columns.to_series()
df.columns = [df.columns, s.groupby(s).cumcount()]

df = df.stack().sort_index(level=1).reset_index(level=1, drop=True).reset_index()
print (df)
   ID   A   B   C
0  10  a1  b1  c1
1  20  a2  b2  c2
2  30  a3  b3  c3
3  10  a4  b4  c4
4  20  a5  b5  c5
5  30  a6  b6  c6
6  10  a7  b7  c7
7  20  a8  b8  c8
8  30  a9  b9  c9

答案 1 :(得分:0)

这是使用列表理解和pd.concat

的另一种方法
df1 = df.set_index('ID')
n=3 #The number of times your column headers repeat
pd.concat([df1.iloc[:,i:i+n] for i in range(0,df1.shape[1],n)]).reset_index()

输出:

   ID   A   B   C
0  10  a1  b1  c1
1  20  a2  b2  c2
2  30  a3  b3  c3
3  10  a4  b4  c4
4  20  a5  b5  c5
5  30  a6  b6  c6
6  10  a7  b7  c7
7  20  a8  b8  c8
8  30  a9  b9  c9