Python Pandas DF Pivot 和 Groupby

Posted

技术标签:

【中文标题】Python Pandas DF Pivot 和 Groupby【英文标题】:Python Pandas DF Pivot and Groupby 【发布时间】:2020-12-18 08:28:57 【问题描述】:

每次 text_y 列中的值发生变化时,我需要遍历我的数据框行并将单列 bounding_box_y 旋转为 8 列。

原始数据框

所需的数据帧

任何人都可以帮助一些不会将值硬编码到代码中的代码吗?整个数据框超过 6000 行。每次另一列中的值发生变化时,我都需要将一列转为 8。

谢谢!

【问题讨论】:

【参考方案1】:

请尝试将您的数据包含为可调用代码,以便其他人可以轻松复制/粘贴和实验。在您的情况下,您可以使用df.head(16).to_dict('list') 获得它。我用了以下

df = pd.DataFrame(
    'boundingBox_y': [183, 120, 305, 120, 305, 161, 182, 161, 318, 120, 381, 120, 382, 162, 318, 161],
    'text_y': (['FORM'] * 8) + (['ABC'] * 8),
    'confidence': ([0.987] * 8) + ([0.976] * 8)
    )

然后您可以pivot 您的数据框,但您需要添加一个新列来保存旋转后的列名称。

# rename the current values column
df.rename('boundingBox_y': 'value', axis=1, inplace=True)

# create a column that contains the columns headers and can be pivoted
df['boundingBox_y'] = df.groupby(['confidence', 'text_y']).transform('cumcount')

# pivot your df
df = df.pivot(index=['confidence', 'text_y'],
    columns='boundingBox_y', values='value')

输出

boundingBox_y        0    1    2    3    4    5    6    7
confidence text_y
0.976      ABC     318  120  381  120  382  162  318  161
0.987      FORM    183  120  305  120  305  161  182  161

【讨论】:

谢谢。我试图在不列出代码中的数据点的情况下做到这一点。这是因为表中有超过 6000 行需要在不同点进行透视,但总是在行数据更改时进行。我需要遍历 6000 行,而不是在每行中有 8 行具有不同边界框坐标的重复数据行,我想要一行具有 8 个边界框列的数据。 请编辑您的问题并解释此输出与您想要的结果有何不同,我无法理解您想要什么... 嗨 Richie,boundingBox_y 值看起来是硬编码的。如何在不对值进行硬编码的情况下迭代数据帧? “硬编码”是什么意思?transform 行将根据需要创建尽可能多的 id,因此您的数据中可能有超过 8 列...您尝试过吗?如果不是您期望的结果,请编辑您的问题并使用此代码和完整数据显示结果,并说明需要改进的地方 您好,我确实尝试了代码,它仅对包含在示例数据中的前 16 行值产生了正确的结果。我得到了您在“输出”中发布的结果。但我需要的不仅仅是两行。我需要它遍历 6000 行,但它没有迭代。

以上是关于Python Pandas DF Pivot 和 Groupby的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas pivot_table - 一列中的值计数[重复]

python pandas 长表格转换为宽表格/宽表格转换为长表格

Pandas 数据框宽 vs 长 - MULTIPLE df 的 unstack vs pivot vs external join

Pandas 透视表pivot_table详解

Pivot一个多列的pandas数据框架。

pandas query