Pandas中的groupby shifting

3

我应该如何将这个转换为:

 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的问题和食谱页面,并且认为我可以做出类似下面的操作:
df.groupby(['year','artist'])['genre_sales'].shift(1)

或者

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

但我认为这些只能在艺术家每年制作一张专辑的情况下才有效。

当前的“类型销售额”是该艺术家所在流派的年度销售额。我正在尝试获得上一年度每位艺术家在同一行中的“类型销售额”。每个流派每年都会有多位艺术家,每位艺术家在特定年份中可能没有或有多个条目。


实际上我无法弄清如何将第一个数据框转换为第二个。你能具体说明一下吗?(你想要实现哪个函数?) - Fabio Lamanna
2个回答

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')

-1
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 是原始数据的副本吗? - user2891518
哎呀,是的,这只是一份副本。现在已经修复了。 - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接