如何在 Pandas 数据帧组中移动一列,然后重新加入单个数据帧?

如果我有这样的数据框:


category name index 

A        A11   1

A        A12   1

A        A13   1

A        A21   2

A        A22   2

A        A23   2

...

B        B11   1

B        B21   2

...


我想首先按类别和索引对数据框进行分组,在每个组内我想name按索引值(反向移位)- 1 移动列。


所以结果会是这样的:


category name index 

A        A11   1    # Do not shift anything because index is 1

A        A12   1

A        A13   1

A        A22   2    # Shift -1 for anything in (A, 2) group because index here is 2

A        A23   2

A        A24   2

...

B        B11   1

B        NA    2  # at the end of each group it should be NA

我曾尝试使用 .groupby() 然后使用 .apply() 但似乎没有简单的方法将结果连接回数据帧。貌似apply方法只能返回一个系列。我如何使用 apply 方法实现这一目标?


郎朗坤
浏览 144回答 2
2回答

慕妹3146593

如果我理解你的问题l=[y.assign(name=y.name.shift(-x[1]+1).values) for x , y in df.groupby(['category','index'])]Newdf=pd.concat(l)NewdfOut[644]:   category name  index0        A  A11      11        A  A12      12        A  A13      13        A  A23      24        A  A24      25        A  NaN      2

哆啦的时光机

如果我理解正确,我认为你可以做到这一点的一种方法:给定 df,  category name  index0        A  A11      11        A  A12      12        A  A13      13        A  A21      24        A  A22      25        A  A23      26        B  B11      17        B  B21      2使用查询过滤索引不是 1 的地方,然后groupby在索引等于 1 的过滤器数据帧的内部移位并连接部分到移位的数据帧。df_shifted = (df.query("index > 1").groupby(['category','index'])                                   .apply(lambda x: x['name'].shift(-1))                .reset_index().set_index('level_2').rename_axis(None))df_out = pd.concat([df_shifted, df.query("index == 1")], sort=False).sort_index()df_out输出:  category  index name0        A      1  A111        A      1  A122        A      1  A133        A      2  A224        A      2  A235        A      2  NaN6        B      1  B117        B      2  NaN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python