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