1

我的目标是使用标准输入管道将数据帧加载到数据库中,以加载在命令行执行的加载语句(例如 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 字符串函数自己构建原始字节字符串。不是很满意,我知道。在某些时候,我们也应该为 pandas 构建一个性能更好的 to_csv:

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

于 2012-11-09T20:56:19.623 回答