我有一个表示,路径和路径上的元素的数据框。
>>> import pandas as pd
>>>
>>> df = pd.DataFrame({
... 'path_id' : [1,1,1,1,2,2,2,2,3,3,3,3,3],
... 'priority' : [1,2,3,4,1,2,3,4,1,2,3,4,5],
... 'element':['X', 'B', 'C', 'D', 'Y', 'C', 'D', 'E', 'Z', 'B', 'E', 'F', 'G']
... })
>>> df
path_id priority element
0 1 1 X
1 1 2 B
2 1 3 C
3 1 4 D
4 2 1 Y
5 2 2 C
6 2 3 D
7 2 4 E
8 3 1 Z
9 3 2 B
10 3 3 E
11 3 4 F
12 3 5 G
>>>
因此在path_id = 1中,元素X连接到元素B,元素B连接到元素C,依此类推。 我已经计算出每个元素的最大位置,如下所示:
>>> df_max_priority = df.groupby(['element']).priority.max().sort_values(ascending=False).reset_index()
>>> df_max_priority
element priority
0 G 5
1 F 4
2 E 4
3 D 4
4 C 3
5 B 2
6 Z 1
7 Y 1
8 X 1
现在,我已按照path_id对数据帧进行了分组,以获取宽格式:
>>> df_wide = df.groupby(['path_id', 'priority'])['element'].first().unstack().sort_values(1)
>>> df_wide
priority 1 2 3 4 5
path_id
1 X B C D NaN
2 Y C D E NaN
3 Z B E F G
我现在需要的是对齐这样的元素:
>>> pd.DataFrame([
... [1, 'X', 'B', 'C', 'D', '', '', ''],
... [2, 'Y', '', 'C', 'D', 'E', '', ''],
... [3, 'Z', 'B', '', '', 'E', 'F', 'G'],
... ])
0 1 2 3 4 5 6 7
0 1 X B C D
1 2 Y C D E
2 3 Z B E F G
>>>
这意味着,每个元素应在其列中,但最大位置显示哪个元素在另一个元素上方。例如,元素G必须位于最右边,因为其最大位置最高。 在现实生活中,元素名称不是按字母顺序排列的。
NaN应该标记跳过的元素(孔)。
如何以这种方式对齐数据框?