如何在pandas groupby中移动整个组?

3

给定以下数据:

data = {'a' : [1,1,1,8,8,3,3,3,3,4,4] }
df = pd.DataFrame(data)

我现在想将整个东西向下移动n个,以便保留它们当前的顺序。当向下移动n=1时,期望的输出应为:

desired_output = {'a': [NaN,NaN,NaN,1,1,8,8,8,8,3,3] }
desired_output_df = pd.DataFrame(desired_output)

n=2的移位应该是:

desired_output = {'a': [NaN,NaN,NaN,NaN,NaN,1,1,1,1,8,8] }
desired_output_df = pd.DataFrame(desired_output)

我一直在尝试使用groupby/transform/apply,但目前还没有得到任何有效的结果。如果我使用groupby然后进行shift操作,它会将每个组都进行移动,并输出以下结果:

NOT_desired_output = {'a' : [NaN, 1, 1, NaN, 8, NaN, 3,3,3, NaN, 4]}

我可以通过迭代来强制执行,但我相信有更好的解决方案。有什么想法吗?
1个回答

2

这是一个有趣的操作。我可以想到另一种使用 replace 的替代方法。

要向右移动1个组:

>>> df['b'] = df.a.shift()
>>> x = df[df.a != df.b]
>>> df.replace(*x.values.T)

这将生成DataFrame:

     a   b
0  NaN NaN
1  NaN NaN
2  NaN NaN
3    1 NaN
4    1   1
5    8   1
6    8   8
7    8   8
8    8   8
9    3   8
10   3   3

我们只需要这个DataFrame的列a

desired_output_df = pd.DataFrame(_, columns=['a'])

要想移动超过一个分组,您只需要移动x的列b。如果您想要移动n个分组,则需要将x.b额外移动n-1次。只需插入该行即可。
>>> x.b = x.b.shift(n-1)

在执行 x = df[df.a != df.b] 后,接下来进行 df.replace(*x.values.T) 步骤。

有趣——我正试图查看是否可以多次移位并更新问题以包括该内容。 - user3738579
啊,太好了 - 我仍在努力理解它的工作原理,但显然它确实有效! - user3738579
(*x.values.T) 是通过列进行 NumPy 数组的元组解包(详见答案)。它基本上使用列 ab 来进行适当的查找/替换列表。 - Alex Riley

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