【问题标题】:Pandas: How to Squash Multiple Rows into One Row with More ColumnsPandas:如何将多行压缩为具有更多列的一行
【发布时间】:2022-11-25 04:14:59
【问题描述】:

我正在寻找一种方法将 pandas 数据框中的 5 行转换为一行,列数是列数的 5 倍(所以我有相同的信息,只是被压缩成一行)。让我解释:

我正在处理曲棍球比赛统计数据。目前,在不同的situations中有5行代表同一个游戏,每行111列。我想将这 5 行转换为一行(以便一场比赛由一行表示)但保留不同情况下包含的信息。换句话说,我想将 5 行,每行 111 列转换成一行 554 列(554=111*5 减一,因为我们在 gameId 上加入)。

这是我的 DF 头:

因此,作为示例,我们可以看到前 5 行有 gameId = 2008020001,但每一行都有不同的 situation(即 otherall5on54on55on4)。我希望将这 5 行转换为带有 gameId = 2008020001 的一行,并根据它们的情况标记列。

例如,我想要 all unblockedShotAttemptsAgainst5on5 unblockedShotAttemptsAgainst5on4 unblockedShotAttemptsAgainst4on5 unblockedShotAttemptsAgainstother unblockedShotAttemptsAgainst 的列(其他所有统计数据都相同)。

任何信息,将不胜感激。还值得一提的是,我的数据集相当大(177990 行),因此需要一个有效的解决方案。生成的数据框应该有五分之一的行和 5 倍的列。提前致谢!

----我已经尝试过的----

我尝试使用 df.apply() 和一些嵌套的 for 循环来做到这一点,但它很快就变得非常丑陋,而且速度非常慢。我认为熊猫有更好的方法来做到这一点,但我不确定如何做。

查看其他SO答案,我最初认为它可能与df.pivot()df.groupby()有关,但我想不通。再次感谢!

【问题讨论】:

  • 请提供一个最小的可重复性例子

标签: python pandas dataframe


【解决方案1】:

听起来你要找的是pd.get_dummies()

cols = df.columns

#get dummies
df1 = pd.get_dummies(df, columns = ['situation'])

#drop all columns from existing df, including original col passed into get dummies
df1.drop(cols, axis=1 , inplace=True)

#add dummy cols to original df
df = pd.concat([df, df1], axis=1)

#drop duplicate rows
df.groupby(cols).first() 

对于最后一行,您还可以使用df.drop_duplicates()https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 2020-11-19
    • 2017-12-25
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多