多列或块熔化然后旋转?
Multi-column or block melt and then pivot?
我正在努力解决数据重塑问题。我有大约这样的数据(但最多 C10 组,我自己添加了一个多索引。
df = pd.DataFrame({('C0',0) : {0:'ID1', 1:'ID2', 2:'ID3'},
('C0',1) : {0:'ID1', 1:'ID2', 2:'ID3'},
('C1',2) : {0:'A' , 1:'A' , 2:'A'},
('C1',3) : {0:'B' , 1:'B' , 2:'B'},
('C1',4) : {0:'C' , 1:'C' , 2:'C'},
('C2',5) : {0:'A' , 1:'A' , 2:'A'},
('C2',6) : {0:'B' , 1:'B' , 2:'B'},
('C2',7) : {0:'C' , 1:'C' , 2:'C'},
('C3',8) : {0:'A' , 1:'A' , 2:'A'},
('C3',9) : {0:'B' , 1:'B' , 2:'B'},
('C3',10) : {0:'C' , 1:'C' , 2:'C'}
})
C0 C1 C2 C3
0 1 2 3 4 5 6 7 8 9 10
0 ID1 ID1 A B C A B C A B C
1 ID2 ID2 A B C A B C A B C
2 ID3 ID3 A B C A B C A B C
ID 列实际上不是相同的值,但此数据的唯一键跨多个列。同样,As、Bs、Cs 实际上不是相同的值,只是不同类型的值。期望的最终结果是这个
0 1 2 3 4 5
0 ID1 ID1 C1 A B C
1 ID1 ID1 C1 A B C
2 ID1 ID1 C1 A B C
3 ID2 ID2 C2 A B C
4 ID2 ID2 C2 A B C
5 ID2 ID2 C2 A B C
6 ID3 ID3 C3 A B C
7 ID3 ID3 C3 A B C
8 ID3 ID3 C3 A B C
为了解决这个问题,我到了一个中间点,我已经融化了第一位,将两个列索引都包含在一行中,但我无法将其重新转换为所需的格式。最终我还需要列举 C 组中的线路,但我相信我可以做到。首先 post 这里,谢天谢地,但我已经尽我所能检查了这里和其他地方。
你可以融化然后拆开:
s = df.melt(id_vars = list(df.columns[:2]), value_vars = list(df.columns[2:]))
d = s.assign(nm = s.groupby(list(s.columns[:3])).cumcount()).drop('variable_1', 1)
d.set_index(list(d.drop('value', 1).columns)).unstack().reset_index()
C0 variable_0 value
nm 0 1 0 1 2
0 ID1 ID1 C1 A B C
1 ID1 ID1 C2 A B C
2 ID1 ID1 C3 A B C
3 ID2 ID2 C1 A B C
4 ID2 ID2 C2 A B C
5 ID2 ID2 C3 A B C
6 ID3 ID3 C1 A B C
7 ID3 ID3 C2 A B C
8 ID3 ID3 C3 A B C
从 hre 你可以删除你想要的列级别
我正在努力解决数据重塑问题。我有大约这样的数据(但最多 C10 组,我自己添加了一个多索引。
df = pd.DataFrame({('C0',0) : {0:'ID1', 1:'ID2', 2:'ID3'},
('C0',1) : {0:'ID1', 1:'ID2', 2:'ID3'},
('C1',2) : {0:'A' , 1:'A' , 2:'A'},
('C1',3) : {0:'B' , 1:'B' , 2:'B'},
('C1',4) : {0:'C' , 1:'C' , 2:'C'},
('C2',5) : {0:'A' , 1:'A' , 2:'A'},
('C2',6) : {0:'B' , 1:'B' , 2:'B'},
('C2',7) : {0:'C' , 1:'C' , 2:'C'},
('C3',8) : {0:'A' , 1:'A' , 2:'A'},
('C3',9) : {0:'B' , 1:'B' , 2:'B'},
('C3',10) : {0:'C' , 1:'C' , 2:'C'}
})
C0 C1 C2 C3
0 1 2 3 4 5 6 7 8 9 10
0 ID1 ID1 A B C A B C A B C
1 ID2 ID2 A B C A B C A B C
2 ID3 ID3 A B C A B C A B C
ID 列实际上不是相同的值,但此数据的唯一键跨多个列。同样,As、Bs、Cs 实际上不是相同的值,只是不同类型的值。期望的最终结果是这个
0 1 2 3 4 5
0 ID1 ID1 C1 A B C
1 ID1 ID1 C1 A B C
2 ID1 ID1 C1 A B C
3 ID2 ID2 C2 A B C
4 ID2 ID2 C2 A B C
5 ID2 ID2 C2 A B C
6 ID3 ID3 C3 A B C
7 ID3 ID3 C3 A B C
8 ID3 ID3 C3 A B C
为了解决这个问题,我到了一个中间点,我已经融化了第一位,将两个列索引都包含在一行中,但我无法将其重新转换为所需的格式。最终我还需要列举 C 组中的线路,但我相信我可以做到。首先 post 这里,谢天谢地,但我已经尽我所能检查了这里和其他地方。
你可以融化然后拆开:
s = df.melt(id_vars = list(df.columns[:2]), value_vars = list(df.columns[2:]))
d = s.assign(nm = s.groupby(list(s.columns[:3])).cumcount()).drop('variable_1', 1)
d.set_index(list(d.drop('value', 1).columns)).unstack().reset_index()
C0 variable_0 value
nm 0 1 0 1 2
0 ID1 ID1 C1 A B C
1 ID1 ID1 C2 A B C
2 ID1 ID1 C3 A B C
3 ID2 ID2 C1 A B C
4 ID2 ID2 C2 A B C
5 ID2 ID2 C3 A B C
6 ID3 ID3 C1 A B C
7 ID3 ID3 C2 A B C
8 ID3 ID3 C3 A B C
从 hre 你可以删除你想要的列级别