2016-10-17 7 views
2

特定の機能を計算する必要のあるパンダデータフレームにレースのさまざまなセクションのデータセットがあります。それは次のようになります。パンダ:一連の列の中で最初に有効な列を見つける方法

だから、
id   distance  timeto1000m timeto800m timeto600m timeto400m timeto200m timetoFinish 
1   1400m  10    21   30   39   50   60  
2   1200m  0    19   31   42   49   57 
3   1800m  0    0    0   38   49   62 
4   1000m  0    0    29   40   48   61 

、私は何をする必要があることは、各行が非ゼロとcorrespoding距離XXである第一timetoXXm列を見つけるためのものです。例えば、400メートルになりid=3ための千メートル、など

だろうid=1のために私はif..elif..else一連の条件でこれを行うことができますが、パンダのルックアップのこの種を行うためのより良い方法がある場合、/思っていました気分が悪い?

答えて

2

あなたはブール条件が満たされた列を返すために、関心のCOLSにidxminを呼び出した後、この第1のフィルタのような関心のCOLSをそれを行うと、スライスを取ることができます:

In [11]: 
df_slice = df.ix[:,df.columns.str.startswith('time')] 
df_slice[df_slice!=0].idxmin(axis=1) 

Out[11]: 
0 timeto1000m 
1  timeto800m 
2  timeto400m 
3  timeto600m 
dtype: object 

In [15]: 
df['first_valid'] = df_slice[df_slice!=0].idxmin(axis=1) 
df[['id','first_valid']] 

Out[15]: 
    id first_valid 
0 1 timeto1000m 
1 2 timeto800m 
2 3 timeto400m 
3 4 timeto600m 
1

使用idxmax(1)

df.set_index(['id', 'distance']).ne(0).idxmax(1) 

id distance 
1 1400m  timeto1000m 
2 1200m  timeto800m 
3 1800m  timeto400m 
4 1000m  timeto600m 
dtype: object 
関連する問題