通过根据列值熊猫数据框将一列置于另一列之下,将多列合并为一列

奥姆

我有以下数据框 df:

Video               1   1   1   1   1   1   1   1   1   1   ... 36  36  36  36  36  36  36  36  36  36
Confidence Value    3   3   4   4   4   5   5   3   5   3   ... 3   3   3   2   4   2   3   3   3   3

其中行Video是具有数据框中列名称的行(即带有粗体的行,表示每列的名称)。

我想要的是重新排列这个数据帧,以便输出是这样的:

Video 1 2 3 ... 36
0     3 5 4 ... 3
1     1 2 3 ... 2
2     2 4 4 ... 5
3     4 5 4 ... 3
...

我尝试搜索不同的方法来以我想要的方式附加、连接、合并等列,但我不知道如何,因为每个 Video 有多个实例,即多个1, 2, .. 36.

因此,对于这些多个实例中的每一个,我想制作其中一列,以视频编号作为列名,行是所有置信度值,如上所示。

那可能吗?

黄比尔

转置枢轴结构可能适合您的需要。

数据

df = pd.read_csv(io.StringIO("""
Video               1   1   1   1   1   2   2   2   2   2   35  35  35  35  35  36  36  36  36  36
Confidence Value    3   3   4   4   4   5   5   3   5   3   3   3   3   2   4   2   3   3   3   3
"""), sep=r"\s{2,}", engine="python", header=None, index_col=0)

print(df)
                  1   2   3   4   5   6   7   ...  14  15  16  17  18  19  20
0                                             ...                            
Video              1   1   1   1   1   2   2  ...  35  35  36  36  36  36  36
Confidence Value   3   3   4   4   4   5   5  ...   2   4   2   3   3   3   3
[2 rows x 20 columns]

代码

这应该适用于每个视频的无限数量的置信度值:

idx = df.transpose().groupby("Video").cumcount().values
ans = df.transpose().set_index(idx).pivot(columns="Video", values="Confidence Value")

注意:如果每个视频的置信度值数量相同(示例中为 5),则groupby-cumcount可以进一步简化步骤:

ans = df.transpose().set_index(np.tile(range(5), 4)).pivot(columns="Video", values="Confidence Value")

结果

print(ans)

Video  1   2   35  36
0       3   5   3   2
1       3   5   3   3
2       4   3   3   3
3       4   5   2   3
4       4   3   4   3

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章