2

「上三角」に見えるデータフレームがあります。

            31-May-11  30-Jun-11  31-Jul-11  31-Aug-11  30-Sep-11  31-Oct-11
OpenDate
2011-05-31  68.432797  81.696071  75.083249  66.659008  68.898034  72.622304
2011-06-30        NaN   1.711097   1.501082   1.625213   1.774645   1.661183
2011-07-31        NaN        NaN   0.422364   0.263561   0.203572   0.234376
2011-08-31        NaN        NaN        NaN   1.077009   1.226946   1.520701
2011-09-30        NaN        NaN        NaN        NaN   0.667091   0.495993

i番目の行を左にシフトして変換したいと思いi-1ます。

            31-May-11  30-Jun-11  31-Jul-11  31-Aug-11  30-Sep-11  31-Oct-11
OpenDate
2011-05-31  68.432797  81.696071  75.083249  66.659008  68.898034  72.622304
2011-06-30  1.711097   1.501082   1.625213   1.774645   1.661183   NaN
2011-07-31  0.422364   0.263561   0.203572   0.234376   NaN        NaN
2011-08-31  1.077009   1.226946   1.520701   NaN        NaN        NaN
2011-09-30  0.667091   0.495993   NaN        NaN        NaN        NaN   

編集:

行列の上部に NaN が存在する可能性を除外することはできないため、次のように表示される可能性があります。

            31-May-11  30-Jun-11  31-Jul-11  31-Aug-11  30-Sep-11  31-Oct-11
OpenDate
2011-05-31  68.432797  81.696071  75.083249  66.659008  68.898034  72.622304
2011-06-30        NaN        NaN   1.501082   1.625213   1.774645   1.661183
2011-07-31        NaN        NaN   0.422364   0.263561   0.203572   0.234376
2011-08-31        NaN        NaN        NaN   1.077009   1.226946   1.520701
2011-09-30        NaN        NaN        NaN        NaN   0.667091   0.495993

に変換する必要があります

            31-May-11  30-Jun-11  31-Jul-11  31-Aug-11  30-Sep-11  31-Oct-11
OpenDate
2011-05-31  68.432797  81.696071  75.083249  66.659008  68.898034  72.622304
2011-06-30  NaN        1.501082   1.625213   1.774645   1.661183   NaN
2011-07-31  0.422364   0.263561   0.203572   0.234376   NaN        NaN
2011-08-31  1.077009   1.226946   1.520701   NaN        NaN        NaN
2011-09-30  0.667091   0.495993   NaN        NaN        NaN        NaN   

これを達成する方法はありますか?

ありがとう、アン

4

5 に答える 5

4
df.apply(lambda x: x.shift(-x.notnull().argmax()), 1)

ラムダ関数は最初の非 null 値の位置を見つけ、それに応じて行をシフトします。これには 2 つの問題があります。既知の構造 (上三角) を利用しないため、速度が犠牲になる可能性があり、さらに、データ内の余分な NaN によってだまされる可能性があります。

アップデート

itertools のカウンターを使用した、より堅牢なソリューション。

from itertools import count
c = count()
df.apply(lambda x: x.shift(-c.next() + 1), 1)

これは、予想どおり、少し高速です。

In [47]: %timeit df.apply(lambda x: x.shift(-c.next() + 1), 1)
1000 loops, best of 3: 766 us per loop

In [49]: %timeit df.apply(lambda x: x.shift(-x.notnull().argmax()), 1)
1000 loops, best of 3: 1.08 ms per loop
于 2013-08-06T14:33:39.513 に答える
0

設定

In [23]: df = DataFrame(np.arange(40).reshape(10,4))

In [24]: df
Out[24]: 
    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19
5  20  21  22  23
6  24  25  26  27
7  28  29  30  31
8  32  33  34  35
9  36  37  38  39

これがどれだけ速いかはわかりません....

In [21]: def f(i,x):
   ....:     return x.shift(-i+1)
   ....: 

In [31]: DataFrame([ f(i,x) for i,x in df.iterrows() ])
Out[31]: 
    0   1   2   3
0 NaN   0   1   2
1   4   5   6   7
2   9  10  11 NaN
3  14  15 NaN NaN
4  19 NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN NaN NaN NaN
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
9 NaN NaN NaN NaN
于 2013-08-06T15:12:48.323 に答える