【发布时间】:2017-04-17 18:40:32
【问题描述】:
这里是熊猫的新手。 我有一个名为 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 以避免迭代行,我们将不胜感激。谢谢。
【问题讨论】:
-
您不能将此列保存到文件中,然后使用单个
read_fwf调用一次读取所有行吗? -
我宁愿在 read_fwf 之前不将文件写回磁盘。谢谢你的建议。
标签: python python-3.x pandas dataframe apply