使用read_fwf调用pandas Series应用函数

时间:2017-04-17 18:40:33

标签: python python-3.x pandas dataframe apply

这里有熊猫新手。 我有一个名为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_specsin_colsin_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以避免迭代行是值得赞赏的。感谢。

1 个答案:

答案 0 :(得分:0)

您是否尝试过这样做:

invoice = pd.read_fwf(filename, colspecs=in_specs, 
                      names=in_cols, converters=in_convert)