2016-09-20 15 views
1

私は、大きなデータセットに対してより効率的なグループ化を行うために、Python 3でパンダのデータフレームをビンしようとしています。現在、パフォーマンスのボトルネックは、.apply()メソッドを使用してデータフレームを反復処理しています。反復せずにパンダの16進カラムを変換する

カラム内のすべてのエントリは16進数であるため、pd.to_numeric関数は必要なものを正確に実行する必要があります。

私はさまざまなオプションを試しましたが、これまでのところ何も機能していません。

# This sets all values to np.nan with coerced errors, 'Unable to parse string' with raise errors. 
dataframe[bin] = pd.to_numeric(dataframe[to_bin], errors='coerce') % __NUM_BINS__ 

# Gives me "int() Cannot convert non-string with explicit base" 
dataframe[bin] = int(dataframe[to_bin].astype(str), 16) % __NUM_BINS__ 

# Value Error: Invalid literal for int with base 10 'ffffffffff' 
dataframe[bin] = dataframe.astype(np.int64) % __NUM_BINS__ 

お勧めはありますか?これは、人々が過去に取り組まなければならなかったようなものです。

+1

このソリューションを使用して列エンティティを文字列に変換しようとしましたか:http://stackoverflow.com/a/22231860/1607105? 'int(x、16)'にHEX値があることがわかるように、文字列変換の後に '0x'接頭語を追加する必要があるかもしれません。 – dblclik

+0

私はちょうど文字列に変換し、値に0xを付加してみましたが、 "int()明示的なベースで非文字列を変換できません"。私は自分のデータフレームをチェックし、実際の値は間違いなく文字列(例として0xfffff)です。 – ZSmyth

+0

'list-comprehension'を使ってパフォーマンスを改善し、そこからシリーズを作成することができます。次のようになります: '[int(x、16)for ser.tolist()]' –

答えて

0

上記のコメントの助けを借りれば、これをより速く達成するには、ジェネレータ機能を使用することです。そうすれば、提供されたデータが16進数から変換できない場合は、例外を処理できます。

def bin_vals(lst): 
    for item in lst: 
     try: 
      yield int(item, 16) % __NUM_BINS__ 
     except: 
      yield __ERROR_BIN__ #whatever you store weird items in 

その後、あなたの変換部には、次の操作を行います。それぞれの行を反復処理からかなりのスピードアップにつながっ

dataframe['binned_value'] = [bin for bin in bin_vals(df['val_to_bin'].tolist())] 

。もともと私が使っていた適用方法よりも速かったです。

関連する問題