【问题标题】:groupby shifting in pandasgroupby 在 pandas 中移动
【发布时间】:2015-09-18 22:07:24
【问题描述】:

我该如何转这个:

 year artist           genre    genre_sales
 1999      A        Pop/Rock             10
 1999      B        Hip/Hop              15
 1999      C        Country               8            
 2000      A        Pop/Rock             11
 2000      B        Hip/Hop              14
 2000      D        Jazz                  1
 2001      B        Hip/Hop              18
 2001      C        Country              10

进入这个:

 year artist           genre    genre_sales
 1999      A        Pop/Rock            Nan 
 1999      B        Hip/Hop             Nan
 1999      C        Country             Nan
 2000      A        Pop/Rock             10
 2000      B        Hip/Hop              15
 2000      D        Jazz            (1999 Jazz sales despite D not releasing in '99)
 2001      B        Hip/Hop              14
 2001      C        Country         (2000 country values, not the 8 from '99)

我看到了 groupby-shift question and cookbook 页面,并认为我可以这样做:

df.groupby(['year','artist'])['genre_sales'].shift(1)

df.groupby(['year','genre','artist'])['genre_sales'].shift(1)

但我认为只有艺术家每年制作一张专辑才能奏效。

Current 'Genre Sales' 是该艺术家在该年的流派的年销售额。我正在努力让每位艺术家连续获得上一年的“流派销售”。每个流派每年都会有多个艺术家,并且每个艺术家在给定的年份中可以有零个或多个该流派的条目。

【问题讨论】:

  • 实际上我无法弄清楚如何将第一个数据帧转换为第二个数据帧。能否请您更具体一些(您想实现哪个功能?)

标签: python pandas


【解决方案1】:

另一种方法是使用 groupby-apply 组合

创建一个应用于每个段的函数并添加一个新列,该列是移动的目标列:

def shiftCol(grp, newCol, col):
    grp[newCol] = grp[col].shift()
    return grp

然后只需调用该函数,指定要移位的列的名称

df.groupby(['artist']).apply(shiftCol, newCol = 'prev_genre_sales',col = 'genre_sales')

【讨论】:

    【解决方案2】:
    df_prev = df.copy()
    
    df[     'prev_year'] = df[     'year'] - 1    
    df_prev['prev_year'] = df_prev['year']
    df_prev[     'year'] = df_prev['year'] + 1
    
    df2 = df.merge( df_prev, how='outer', on=['year','prev_year','artist','genre'], 
                    suffixes=['','_prev'] )
    
    df2.sort(['artist','genre','year']).fillna(0)
    
        year artist     genre  genre_sales  prev_year  genre_sales_prev
    0   1999      A  Pop/Rock           10       1998                 0
    3   2000      A  Pop/Rock           11       1999                10
    9   2001      A  Pop/Rock            0       2000                11
    1   1999      B   Hip/Hop           15       1998                 0
    4   2000      B   Hip/Hop           14       1999                15
    6   2001      B   Hip/Hop           18       2000                14
    11  2002      B   Hip/Hop            0       2001                18
    2   1999      C   Country            8       1998                 0
    8   2000      C   Country            0       1999                 8
    7   2001      C   Country           10       2000                 0
    12  2002      C   Country            0       2001                10
    5   2000      D      Jazz            1       1999                 0
    10  2001      D      Jazz            0       2000                 1
    

    【讨论】:

    • 顶部的 df 和 df_prev 是怎么回事? df_prev 是原件的副本吗?
    • 糟糕,是的,这只是一个副本。现已修复。
    猜你喜欢
    • 2016-01-21
    • 2021-07-20
    • 2019-10-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2017-06-05
    • 2022-06-11
    相关资源
    最近更新 更多