Python 有效地将列表列表追加到数据帧

Python 有效地将列表列表追加到数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个嵌套结构的程序,目前使用明显的方法编写,用于将列表列表附加到顶级DataFrame(通过从列表列表创建DataFrame,然后将其附加到目标DataFrame): 问题是,当我对此进行分析时,创建子DataFrame需要花费大量时间: Timer unit: 1e-06 s Total time: 0.012352 s File: <ipython-input-43-d816d566eb1b> Function: test at line 1 Line # Hi

我有一个嵌套结构的程序,目前使用明显的方法编写,用于将列表列表附加到顶级
DataFrame
(通过从列表列表创建
DataFrame
,然后将其附加到目标
DataFrame
):

问题是,当我对此进行分析时,创建子
DataFrame
需要花费大量时间:

Timer unit: 1e-06 s

Total time: 0.012352 s
File: <ipython-input-43-d816d566eb1b>
Function: test at line 1

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     1                                           def test(outer, inner):
     2         1       5542.0   5542.0     44.9      df = pd.DataFrame(columns=columns)
     3         3          5.0      1.7      0.0      for i in range(outer):
     4         2         10.0      5.0      0.1          children = create_children(inner, i)
     5         2       4341.0   2170.5     35.1          child_df = pd.DataFrame(children, columns=columns)
     6         2       2454.0   1227.0     19.9          df = pd.concat([df, child_df])
     7                                           # Works in this case but problems with an index and slightly slower
     8                                           #         df = df.append(child_df)
     9                                           
    10         1          0.0      0.0      0.0      return df
给予:

Timer unit: 1e-06 s

Total time: 0.002104 s
File: <ipython-input-44-05d8d95dfe60>
Function: test2 at line 1

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     1                                           def test2(outer, inner):
     2         1          1.0      1.0      0.0      all_children = []
     3         3          4.0      1.3      0.2      for i in range(outer):
     4         2          8.0      4.0      0.4          children = create_children(inner, i)
     5         2          2.0      1.0      0.1          all_children.extend(children)
     6                                           
     7         1       2088.0   2088.0     99.2      df = pd.DataFrame(all_children, columns=columns)
     8                                                   
     9         1          1.0      1.0      0.0      return df
定时器单元:1e-06秒
总时间:0.002104秒
文件:
功能:第1行的test2
行#每次命中的命中次数%时间行内容
==============================================================
1 def测试2(外部、内部):
2 11.0 1.0 0 0.0所有儿童=[]
3 4.0 1.3 0.2适用于范围内的i(外部):
4 2 8.0 4.0 0 0.4子项=创建子项(内部,i)
5 2.0 1.0 0 0.1所有儿童。扩展(儿童)
6.
7 1 2088.0 2088.0 99.2 df=pd.DataFrame(所有子项,列=列)
8.
9 1 1.0 1.0 0 0.0返回测向
不幸的是,所讨论的程序在外循环中使用了
DataFrame
特性,因此我不能简单地取消
DataFrame
的使用。(我的最终目标是这样做,但这是一个相当多的重构。)


我的问题是:有没有一种方法可以在不创建中间数据帧的情况下将一致的列表列表附加到
数据帧
,这似乎需要大量开销?

我建议将中间数据保存在字典中,并将该字典附加到列表中。最后,您只需创建最终数据帧:

columns=["inner", "outer", "col1", "col2", "col3", "col4"]
def create_children(inner, outer):
results = []
for i in range(inner):
    dct = {'inner': some_value,
           ....,
          {'col4':  another_value,
    results.append(dct)
return results

def test(outer, inner):
all_results = []
for i in range(outer):
    children = create_children(inner, i)
    all_results.extend(children)

df = pd.DataFrame(all_results, columns=columns)
return df

阅读此文:同意等待组装数据帧直到结束是最佳的-我在文章中使用列表列表进行组装,因为这是计算数据的方式,但在许多其他应用程序中,我都是这样做的。我只是想弄清楚是否有一种方法可以更有效地逐段完成,因为我目前在外循环期间需要数据帧功能。我明白了。嗯,创建数据帧是一项昂贵的操作。根据您的用例,也许您应该看看如何使用numpy阵列实现您想要的,它们比使用数据帧快得多。这是长期目标。我只是对当列匹配并且已经知道时追加的开销感到惊讶。我希望我遗漏了一些不明显的东西。
Timer unit: 1e-06 s

Total time: 0.002104 s
File: <ipython-input-44-05d8d95dfe60>
Function: test2 at line 1

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     1                                           def test2(outer, inner):
     2         1          1.0      1.0      0.0      all_children = []
     3         3          4.0      1.3      0.2      for i in range(outer):
     4         2          8.0      4.0      0.4          children = create_children(inner, i)
     5         2          2.0      1.0      0.1          all_children.extend(children)
     6                                           
     7         1       2088.0   2088.0     99.2      df = pd.DataFrame(all_children, columns=columns)
     8                                                   
     9         1          1.0      1.0      0.0      return df
columns=["inner", "outer", "col1", "col2", "col3", "col4"]
def create_children(inner, outer):
results = []
for i in range(inner):
    dct = {'inner': some_value,
           ....,
          {'col4':  another_value,
    results.append(dct)
return results

def test(outer, inner):
all_results = []
for i in range(outer):
    children = create_children(inner, i)
    all_results.extend(children)

df = pd.DataFrame(all_results, columns=columns)
return df