2017-10-10 3 views
0

私はCSVファイルから取り込まれたpandasデータフレームを使用しています。次に、Bokehを使用してそのデータフレームをColumnDataSourceに変換します。以下のように見える列データソースを使用すると、どのように行のインデックスを取得できますか?

dataFrame = pandas.read_csv('somefile.CSV') 
source = ColumnDataSource(dataFrame) 

今、私はすべての私のコラムを持っていることを、私は、行ベースの計算をしたいです。例えば

:私は3つの列があります。それが移入される可能性があります

x, y, colour 

を:私はを検索するとき今

1, 2, blue 
2, 5, red 
1, 8, yellow 

、私は、その行に、いくつかの関連した変数を変更したいですソースなので、どのように私はこれを行うことができます:

# how do i step through the source dictionary? 
if source['colour'] == 'blue': 
    # how do I get the current index, which is the row number 
    # how do I change the x column value at the index(row) we retrieved 
    source['x' index] = 2 

ありがとうをあなたがこれを使用して 'colour'列に 'blue'の最初の値のインデックスを取得することができます全体ColumnDataSourceを反復を避けるために、代わりに

dataFrame = pandas.read_csv('somefile.csv') 
source = ColumnDataSource(dataFrame) 

for index, colour in enumerate(source.data['colour']): 
    if colour == 'blue': 
     source.data['x'][index] = 2 

:あなたはデータを反復している場合

答えて

1

あなたは、このようにそれを行うことができます:

source.data['x'][list(source.data['colour']).index('blue')] = 2 

list(source.data['colour']).index('blue') 

あなたは、編集欄このようなxの指標としてこれを使用することができます

この方法でこのリストを索引すると、値'blue'の最初の索引が得られます。あなたはColumnDataSourceに'blue'の複数の出現を持っている場合は関連する'x'値は、あなただけの'blue'の最後のインデックスの後に始まるリストのインデックスを作成することにより、'colour'列を反復処理することができるはずで編集する必要のある:

list(source.data['colour'])[last_index+1:].index('blue') 

index('blue')は、'blue'という値が含まれていない場合、検索対象のリストにValueErrorがスローされるため、このループはtry-statementでラップする必要があります。

+0

ありがとうございました。私はdataFrame.iloc [index]も取得できて、行を返します。誰かがこれを行うためのより速い方法を知っている場合は、上記の方法と私の方法の両方が大きなデータセットで非常に遅いのでお知らせください。 – cyclops

+0

最初に(ColumnDataSourceに入る前に)変更を加えるだけであれば、pandas dataFrameでこれらの変更を行うことがほぼ確実に最速になります。 'df ['x']。loc [(df ['color'] == 'blue')] = 2'とすることもできます。大規模なデータセットであっても、これはまだ非常に高速です。 –

0

使用

source.x[source.color == 'blue'] = 2 

source.xカッコ内の条件は、それが真である行のみを選択し、変更したいシリーズです。

関連する問題