这里有熊猫新手。 我有一个名为all_invoice的pandas DataFrame,其中只有一列名为' whole_line'。
all_invoice中的每一行都是固定宽度的字符串。我需要使用read_fwf
从all_invoice获取新的DataFrame。
我有一个看起来像这样的工作解决方案:
invoice = pd.DataFrame()
for i,r in all_invoice['whole_line'].iteritems():
temp_df = pd.read_fwf(StringIO(r), colspecs=in_specs,
names=in_cols, converters=in_convert)
invoice = invoice.append(temp_df, ignore_index = True)
我的脚本中已经定义了 in_specs
,in_cols
和in_convert
。
所以这个解决方案有效,但速度很慢。对于具有85列的18K行,这部分代码执行大约需要6分钟。我希望有一个更优雅的解决方案,它不会涉及迭代DataFrame或Series中的行,并且将使用apply函数调用read_fwf
以使其更快。所以我试过了:
invoice = all_invoice['whole_line'].apply(pd.read_fwf, colspecs=in_specs,names=in_cols, converters=in_convert)
我追溯的尾端看起来像:
OSError: [Errno 36] File name too long:
以下冒号是传递给read_fwf
方法的字符串。我怀疑这种情况正在发生,因为read_fwf
需要文件路径或缓冲区。在我工作(但很慢)的代码中,我能够在字符串上调用StringIO()使其成为缓冲区,但我无法使用apply函数。任何有关获取应用工作的帮助或其他方式一次性使用整个系列/ df上的read_fwf
以避免迭代行是值得赞赏的。感谢。
答案 0 :(得分:0)
您是否尝试过这样做:
invoice = pd.read_fwf(filename, colspecs=in_specs,
names=in_cols, converters=in_convert)