1

私の目標は、コマンド ラインで実行されるロード ステートメントへの stdin パイプを使用して、データフレームを DB にロードすることです (例: cat {file_loc} | /path/to/sql --command "COPY table FROM STDIN WITH DELIMITER ','; 」)。このアプローチが最適ではないことは承知しています。これは pyodbc の問題による回避策です ;)

データフレームを圧縮して、各行が最後に改行を含む区切り記号で区切られた値を含む文字列になるようにする最も効率的な方法は何ですか? 以下の私の解決策は非効率的です。

from pandas import *
import numpy as np
df = DataFrame(np.random.randint(low=0, high=100, size=(5,3)),columns=['A','B','C'])
df2 = df.apply(lambda d: ','.join([`x` for x in d]))

df.to_csv() などを使用してデータフレームを書き込むのは遅すぎます...

import timeit
m1="""df2=df.apply(lambda d: ','.join([`x` for x in d]))"""
met1t = timeit.Timer(stmt=m1,setup="from pandas import *; import numpy as np; df = DataFrame(np.random.randint(low=0, high=100, size=(5,3)),columns=['A','B','C'])")
print "Method 1: %.2f usec/pass" % (1000000 * met1t.timeit(number=100000)/100000)
# 381.82 usec/pass

m2="""df.to_csv('testout.csv', index=False, header=False)"""
met2t = timeit.Timer(stmt=m2,setup="from pandas import *; import numpy as np; df = DataFrame(np.random.randint(low=0, high=100, size=(5,3)),columns=['A','B','C'])")
print "Method 2:%.2f usec/pass" % (1000000 * met2t.timeit(number=100000)/100000)
# 551.30 usec/pass
4

1 に答える 1

0

pyodbc の問題について説明していただけますか?

ここで問題を作成しました。究極のパフォーマンスを得るには、C または Cython に落とし込み、C 文字列関数を使用して生のバイト文字列を自分で作成します。あまり満足のいくものではありません。ある時点で、パンダ用のよりパフォーマンスの高い to_csv も構築する必要があります。

http://github.com/pydata/pandas/issues/2210

于 2012-11-09T20:56:19.623 に答える