如何移动数据帧组中的一列,然后连接回单个数据帧?

2024-04-27 01:05:43 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有这样一个数据帧:

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
...

我想首先根据category和index对dataframe进行分组,在每个组中,我想将name列按index的值进行移位(反向移位)-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方法实现这一点?你知道吗


Tags: 数据方法nameindexapplyanything移位category
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

使用query筛选索引不是1的数据帧,然后在groupby内移动,并将索引等于1的筛选器数据帧的concat部分移动到移位的数据帧。你知道吗

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

如果我理解你的问题

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

相关问题 更多 >