1

各行がソートされたデータフレームを返したいと思います(降順としましょう)。したがって、次のpandas.DataFrame名前がある場合data

In [38]: data
Out[38]: 
                  c1        c2        c3        c4        c5        c6
Date                                                                  
2012-10-22  0.973371  0.226342  0.968282  0.872330  0.273880  0.746156
2012-10-19  0.497048  0.351332  0.310025  0.726669  0.344202  0.878755
2012-10-18  0.315764  0.178584  0.838223  0.749962  0.850462  0.400253
2012-10-17  0.162879  0.068409  0.704094  0.712860  0.537545  0.009789

以下の返品を希望します。

In [39]: sorted_frame
Out[39]: 
                   0         1         2         3         4         5
Date                                                                  
2012-10-22  0.973371  0.968282  0.872332  0.746156  0.273880  0.226342
2012-10-19  0.878755  0.726669  0.497048  0.351332  0.344202  0.310025
2012-10-18  0.850462  0.838223  0.749962  0.400253  0.315764  0.178584
2012-10-17  0.712860  0.704094  0.537545  0.162879  0.068409  0.009789

私は試しましたDataFrame.sort(axis = 1)が、それは望ましい結果を達成しません:

In [40]: data.sort(axis = 1)
Out[43]: 
                  c1        c2        c3        c4        c5        c6
Date                                                                  
2012-10-22  0.973371  0.226342  0.968282  0.872330  0.273880  0.746156
2012-10-19  0.497048  0.351332  0.310025  0.726669  0.344202  0.878755
2012-10-18  0.315764  0.178584  0.838223  0.749962  0.850462  0.400253
2012-10-17  0.162879  0.068409  0.704094  0.712860  0.537545  0.009789

私が探しているものを達成する次の関数を作成しました( を使用pandas.TimeSeries.order()):

import numpy

def sorted_by_row(frame, ascending = False):
    vals = numpy.tile(numpy.nan,frame.shape)
    for row in numpy.arange(frame.shape[0]):
        vals[row, :] = frame.ix[row, :].order(ascending = ascending)
    return pandas.DataFrame(vals, index = frame.index)

ただし、私の目標は、メソッドで行単位の関数を使用できるようにすることDataFrame.apply()です (そのため、作成した他の関数に目的の機能を適用できます)。私はもう試した:

 #TimeSeries.order() sorts a pandas.TimeSeries object
 data.apply(lambda x: x.order(), axis = 1)

しかし、繰り返しますが、私はDataFrame上記の目的を達成していません (私は十分なDataFrame's を出力したので、ページの不動産を惜しみません)。

どうぞよろしくお願いいたします。

-B

4

2 に答える 2

2

さて、箱から出してパンダを使うのはそれほど簡単ではありません。まず、次のことをよく理解してくださいargsort

In [8]: df
Out[8]: 
                   0         1         2         3         4
2012-10-17  1.542735  1.081290  2.602967  0.748706  0.682501
2012-10-18  0.058414  0.148083  0.094104  0.716789  2.482998
2012-10-19  2.396277  0.524733  2.169018  1.365622  0.590767
2012-10-20  0.513535  1.542485  0.186261  2.138740  1.173894
2012-10-21  0.495713  1.401872  0.919931  0.055136  1.358439
2012-10-22  1.010086  0.350249  1.116935  0.323305  0.506086

In [12]: inds = df.values.argsort(1)

In [13]: inds
Out[13]: 
array([[4, 3, 1, 0, 2],
       [0, 2, 1, 3, 4],
       [1, 4, 3, 2, 0],
       [2, 0, 4, 1, 3],
       [3, 0, 2, 4, 1],
       [3, 1, 4, 0, 2]])

これらは、各行の間接ソートインデックスです。今、あなたは次のようなことをしたいと思います:

new_values = np.empty_like(df)
for i, row in enumerate(df.values):
    # sort in descending order
    new_values[i] = row[inds[i]][::-1]

sorted_df = DataFrame(new_values, index=df.index)

それは満足のいくものではありませんが、それは仕事を成し遂げます:

In [15]: sorted_df
Out[15]: 
                   0         1         2         3         4
2012-10-17  2.602967  1.542735  1.081290  0.748706  0.682501
2012-10-18  2.482998  0.716789  0.148083  0.094104  0.058414
2012-10-19  2.396277  2.169018  1.365622  0.590767  0.524733
2012-10-20  2.138740  1.542485  1.173894  0.513535  0.186261
2012-10-21  1.401872  1.358439  0.919931  0.495713  0.055136
2012-10-22  1.116935  1.010086  0.506086  0.350249  0.323305

より一般的には、次のことができます。

In [23]: df.apply(lambda x: np.sort(x.values)[::-1], axis=1)
Out[23]: 
                   0         1         2         3         4
2012-10-17  2.602967  1.542735  1.081290  0.748706  0.682501
2012-10-18  2.482998  0.716789  0.148083  0.094104  0.058414
2012-10-19  2.396277  2.169018  1.365622  0.590767  0.524733
2012-10-20  2.138740  1.542485  1.173894  0.513535  0.186261
2012-10-21  1.401872  1.358439  0.919931  0.495713  0.055136
2012-10-22  1.116935  1.010086  0.506086  0.350249  0.323305

ただし、新しい列を自分で割り当てるのはあなたの責任です

于 2012-11-10T05:26:09.213 に答える
1

並べ替えは大きなテーマであり、これを行うには多くの方法があると確信しています。これが1つです。

最初にサンプルデータフレームを作成します。

In [31]: rndrange = pd.DatetimeIndex(start='10/17/2012', end='10/22/2012', freq='D')    
In [32]: df = pd.DataFrame(np.random.randn(len(rndrange),5),index=rndrange)
In [33]: df = df.applymap(abs)  #Easier to see sorting if all vals are positive
In [34]: df
Out[34]: 
                   0         1         2         3         4
2012-10-17  1.542735  1.081290  2.602967  0.748706  0.682501
2012-10-18  0.058414  0.148083  0.094104  0.716789  2.482998
2012-10-19  2.396277  0.524733  2.169018  1.365622  0.590767
2012-10-20  0.513535  1.542485  0.186261  2.138740  1.173894
2012-10-21  0.495713  1.401872  0.919931  0.055136  1.358439
2012-10-22  1.010086  0.350249  1.116935  0.323305  0.506086

並べ替え:

In [35]: df.as_matrix().sort(1)    
In [36]: df
Out[36]: 
                   0         1         2         3         4
2012-10-17  0.682501  0.748706  1.081290  1.542735  2.602967
2012-10-18  0.058414  0.094104  0.148083  0.716789  2.482998
2012-10-19  0.524733  0.590767  1.365622  2.169018  2.396277
2012-10-20  0.186261  0.513535  1.173894  1.542485  2.138740
2012-10-21  0.055136  0.495713  0.919931  1.358439  1.401872
2012-10-22  0.323305  0.350249  0.506086  1.010086  1.116935
于 2012-11-07T02:02:03.943 に答える