2

给定以下数据:

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,但到目前为止还没有任何工作。如果我分组然后移位,它会移动每个组,给出以下输出:

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

我可以通过迭代来暴力破解它,但我确信有更好的解决方案。有任何想法吗?

4

1 回答 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

我们只想要a这个 DataFrame 的列:

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

要移动多个组,您只需移动b. x如果你想按n组换班,你需要再换x.b一次n-1。只需插入行

>>> x.b = x.b.shift(n-1)

之后x = df[df.a != df.b],然后执行该df.replace(*x.values.T)步骤。

于 2014-12-04T22:30:02.940 回答