繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM