[英]How to shift a column in pandas dataframe group and then join back to be a single dataframe?
如果我有这样的数据框:
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
...
我想首先按类别和索引对数据框进行分组,并在每个组内按索引值(反向移位)- 1 移动name
列。
所以结果会是这样的:
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 方法实现这一目标?
如果我理解你的问题
l=[y.assign(name=y.name.shift(-x[1]+1).values) for x , y in df.groupby(['category','index'])]
Newdf=pd.concat(l)
Newdf
Out[644]:
category name index
0 A A11 1
1 A A12 1
2 A A13 1
3 A A23 2
4 A A24 2
5 A NaN 2
如果我理解正确,我认为你可以做到这一点的一种方法:
给定 df,
category name index
0 A A11 1
1 A A12 1
2 A A13 1
3 A A21 2
4 A A22 2
5 A A23 2
6 B B11 1
7 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 name
0 A 1 A11
1 A 1 A12
2 A 1 A13
3 A 2 A22
4 A 2 A23
5 A 2 NaN
6 B 1 B11
7 B 2 NaN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.