【问题标题】:Invoke pandas Series apply function with read_fwf使用 read_fwf 调用 pandas Series 应用函数
【发布时间】: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_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 以避免迭代行,我们将不胜感激。谢谢。

【问题讨论】:

  • 您不能将此列保存到文件中,然后使用单个read_fwf 调用一次读取所有行吗?
  • 我宁愿在 read_fwf 之前不将文件写回磁盘。谢谢你的建议。

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


【解决方案1】:

你有没有试过只是做:

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

【讨论】:

  • 我没有文件作为输入。相反,原始文件中的行保存在我的输入数据框中。
  • 你有构建 all_invoice 的文件吗?
  • 得到文件,但它有 3 种不同类型的行(行);发票、供应商、采购订单。在我的脚本前面,我使用 pd.read_table 将整个文件读入一个 df,然后根据 20 到 22 的值将该 df 子集到 3 个不同的数据帧中。 all_df = pd.read_table('MARCHGRIEF.TXT', names= ['whole_line'],标题=无)。 all_invoice = all_df[all_df.whole_line.str[20:22] == "IN"] 供应商和采购订单类似。不幸的是, read_fwf 不能让我根据条件解析一行。我需要它,因为每种类型的行/行 po,供应商都有不同的结构。
  • 是的。它是在大型机上运行的进程的副产品。不,那一端的人不会写入 3 个不同的文件。他们只会给我一个文件。
  • 那么为什么不直接使用read_fwf 然后过滤给定包含“in”或其他值的列。这样数据就已经被分段了。
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2016-09-20
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多