2012-10-29 4 views
1

목표는 명령 행에서 실행되는 load 문 (예 : cat {file_loc} |/path/to/sql - 명령)에 stdin 파이프를 사용하여 DB에 데이터 프레임을로드하는 것입니다. "COPY 테이블에서 DELIMITER ','; "). 나는이 접근법이 차선책이라는 것을 알고있다.)pandas : 구분자가있는 df를 평평하게합니다

데이터 프레임을 압축하여 각 행이 끝에 줄 바꿈을 사용하여 구분 기호로 구분 된 값을 포함하는 문자열이되도록하는 가장 효율적인 방법은 무엇입니까? 내 솔루션은 비효율적 인 것처럼 보입니다.

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 사용하여 dataframe ...

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 
+0

이 가능겠습니까? to_csv에서 최적화 할 수있는 기회 일 수 있습니다. –

+0

@ChangShe : 업데이트 된 시간/결과 시간 – Peter

답변

0

당신이 pyodbc 문제를 설명 할 수 쓰기?

여기에 문제가 발생했습니다. 궁극적 인 성능을 얻으려면 C 또는 Cython으로 드롭 다운하고 C 문자열 함수를 사용하여 원시 바이트 문자열을 직접 작성해야합니다. 별로 만족스럽지 않습니다. 어떤 점에서 우리는 너무, 팬더을위한 더 나은 성능 to_csv을 구축한다 : 당신이 무슨 일을하는지 대 데이터와 to_csv의 속도 비교를 게시하는

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

+0

DB에 글을 쓰는 데 특정적인 것이었지만 세부 사항을 결코 알지 못했습니다. 더 자세히 조사하고 나중에 자세한 내용을 제공하려고 노력할 것입니다. – Peter

관련 문제