2

次のデータがあるとします。

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

現在の順序が維持されるように、全体を n groupsだけ下にシフトしたいと思います。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.bn-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 に答える