pd. series . explosion返回ValueError:不能从重复的轴重新索引



我的问题类似于这个SO问题。我试图爆炸下面的数据框使用pd. explosion函数。仔细检查列表中值的长度,我发现列中的列表长度是不同的。例如,TGR1的第4行长度为10,而TGR2TGR3的长度为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

尝试使用stackpivot:

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]

相关内容

  • 没有找到相关文章

最新更新