我的问题类似于这个SO问题。我试图爆炸下面的数据框使用pd. explosion函数。仔细检查列表中值的长度,我发现列中的列表长度是不同的。例如,TGR1
的第4行长度为10,而TGR2
和TGR3
的长度为11。在查看pandas文档时,我发现pd.explode
函数可能会出现ValueError,原因如下:
- 如果框架的列不是唯一的
- 如果指定的列爆炸是空列表。
- 如果指定的列不匹配帧中逐行元素的计数。
my dataframe违反规则3。我的question
什么是可能的方式,我可以转换每个元素的列表,如一行,当我的列表有不同的长度?
下面是我的爆炸函数,数据框和列表跨数据框的长度。
df = (df.set_index(['index']).apply(pd.Series.explode).reset_index())
index TGR1 TGR2 TGR3
0 0 [1, 7, 5, 9, 1, 1, 1, 1, 4, 4, 9, 7] [5, 8, 1, 1, 7, 5, 6, 8, 2, 7, 5, 8] [4, 1, 8, 3, 2, 4, 2, 5, 1, 5, 1, 1]
1 1 [1, 8, 5, 8, 1, 6, 3, 1, 1, 8, 8, 6, 6, 1, 5] [6, 7, 7, 1, 2, 9, 6, 6, 8, 5, 1, 1, 1, 7, 2] [2, 2, 1, 2, 6, 8, 8, 8, 2, 2, 7, 4, 7, 3, 6]
2 2 [7, 2, 1, 1, 3, 8, 2, 1, 8, 4, 8, 7] [4, 4, 6, 5, 2, 3, 7, 6, 7, 7, 4, 1] [2, 8, 5, 1, 6, 6, 1, 1, 4, 1, 5, 3]
3 3 [8, 6, 8, 6, 8, 5, 1, 6, 4, 1, 4, 4] [3, 8, 1, 2, 4, 6, 6, 1, 7, 2, 7, 2] [1, 3, 6, 10, 3, 2, 3, 2, 5, 7, 3, 5]
4 4 [2, 1, 1, 3, 4, 2, 5, 3, 1, 4] [2, 8, 8, 7, 8, 9, 1, 6, 4, 8, 1] [7, 7, 6, 4, 2, 6, 7, 2, 1, 2, 3]
5 5 [8, 8, 4, 8, 8, 1, 1, 4, 5, 5, 2, 1] [2, 2, 5, 1, 6, 6, 6, 8, 4, 1, 6, 8] [1, 1, 8, 6, 3, 3, 2, 2, 2, 4, 1, 7]
TGR1 TGR2 TGR3
12 12 12
1 15 15 15
2 12 12 12
3 12 12 12
4 10 11 11
5 12 12 12
期望的输出应该是这样的形式。
TGR1 TGR2 TGR3
0 1 5 4
1 7 8 1
2 5 1 8
3 9 1 3
4 1 7 2
5 1 5 4
6 1 6 2
7 1 8 5
8 4 2 1
9 4 7 5
10 9 5 1
11 7 8 1
12 1 6 2
13 8 7 2
14 5 7 1
15 8 1 2
16 1 2 6
17 6 9 8
18 3 6 8
19 1 6 8
20 1 8 2
21 8 5 2
22 8 1 7
23 6 1 4
24 6 1 7
25 1 7 3
26 5 2 6
27 7 4 2
28 2 4 8
29 1 6 5
30 1 5 1
31 3 2 6
32 8 3 6
33 2 7 1
34 1 6 1
35 8 7 4
36 4 7 1
37 8 4 5
38 7 1 3
39 8 3 1
40 6 8 3
41 8 1 6
42 6 2 10
43 8 4 3
44 5 6 2
45 1 6 3
46 6 1 2
47 4 7 5
48 1 2 7
49 4 7 3
50 4 2 5
尝试使用stack
和pivot
:
stacked = df.stack().explode().reset_index()
stacked["uid"] = stacked.groupby(["level_0", "level_1"]).cumcount()
output = stacked.pivot(["level_0", "uid"], "level_1", 0).reset_index(drop=True).rename_axis(None, axis=1)
>>> output
TGR1 TGR2 TGR3
0 1 5 4
1 7 8 1
2 5 1 8
3 9 1 3
4 1 7 2
.. ... ... ...
69 4 8 2
70 5 4 2
71 5 1 4
72 2 6 1
73 1 8 7
[74 rows x 3 columns]