如何以合理的性能向数据帧添加行

2024-03-28 06:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约120列的空数据框,我想用文件中的数据填充它。你知道吗

我正在迭代一个大约有180万行的文件。 (这些行是非结构化的,我不能直接将它们加载到数据帧)

对于文件中的每一行,我执行以下操作:

  • 从当前行中提取所需的数据
  • 复制数据帧中的最后一行并将其附加到df = df.append(df.iloc[-1])结尾。副本很重要,前一行中的大部分数据不会更改。
  • 根据我提取的数据更改最后一行中的几个值df.iloc[-1, df.columns.get_loc('column_name')] = some_extracted_value

这是非常缓慢的,我想错误是在附加。你知道吗

加快速度的正确方法是什么?预先分配数据帧?你知道吗

编辑:

在阅读了答案之后,我做了以下工作:

  • 我预先分配了数据帧(节省了大约10%的时间)
  • 我将此:df = df.append(df.iloc[-1])替换为:df.iloc[i] = df.iloc[i-1]i是循环中的当前迭代)。你知道吗
  • 做过评测,尽管我删除了append,但主要问题是复制前一行,这意味着:df.iloc[i] = df.iloc[i-1]占用了大约95%的时间。你知道吗

Tags: columns文件数据namedfget结尾时间
3条回答

在使用append的地方,最终会复制低效的数据帧。请再试一次,但不要说这句话:
df = df.append(df.iloc[-1])

您可以这样做,将最后一行复制到新行(仅当最后一行包含新行中所需的信息时才执行此操作):
df.iloc[...calculate the next available index...] = df.iloc[-1]

然后像您所做的那样相应地编辑最后一行
df.iloc[-1, df.columns.get_loc('column_name')] = some_extracted_value

你可能需要足够的内存,无论你选择哪个选项。你知道吗

但是,您当然应该避免在循环中使用pd.DataFrame.append。这比list.append贵。你知道吗

相反,聚合到一个列表列表中,然后馈送到数据帧中。由于您没有提供示例,下面是一些伪代码:

# initialize empty list
L = []

for line in my_binary_file:

    # extract components required from each line to a list of Python types
    line_vars = [line['var1'], line['var2'], line['var3']]

    # append to list of results
    L.append(line_vars)

# create dataframe from list of lists
df = pd.DataFrame(L, columns=['var1', 'var2', 'var3'])

最快的方法是直接通过pd.read\U csv文件() 尝试分离逻辑以清除非结构化到结构化数据,然后使用pd.read\U csv文件加载数据帧。你知道吗

您可以共享示例非结构化行和逻辑以取出结构化数据,这样就可以共享一些相同的见解。你知道吗

相关问题 更多 >