【问题标题】:Pandas dataframe from list of dictionaries or dictionary of lists? Efficiency来自字典列表或列表字典的熊猫数据框?效率
【发布时间】:2021-09-03 09:27:07
【问题描述】:

我有一个模拟,每一步都会生成数据。我将数据存储在内存中。 经过一定数量的步骤后,我从存储的数据创建了一个 pandas 数据框,并使用df.to_csv 写入(附加)到文件。 我可以从字典列表或列表字典(其中值是列表)创建数据框。其中哪一项会给我更好的性能和内存管理?

选项 A:

data = []
d={'a':1, 'b': 2} # Data from one step
data.append(d)
d={'a':2, 'b': 3} # Data from another step
data.append(d)
# data = [{'a':1, 'b':2}, {'a':2, 'b':3}]
df = pd.DataFrame(data)
with open(output_file, 'a') as f:
    df.to_csv(f, sep=",", index=False, header=f.tell()==0) 
    # Header added at first write

选项 B:

data = {'a':[], 'b':[]}
data['a'].append(1) # Data from one step
data['b'].append(2)
data['a'].append(2) # Data from another step
data['b'].append(3)
# data = {'a':[1,2], 'b':[2,3]}
df = pd.DataFrame(data)
with open(output_file, 'a') as f:
    df.to_csv(f, sep=",", index=False, header=f.tell()==0) 
    # Header added at first write

我有10^510^8 的数据步骤。我想把写作分成几部分。也就是说,

  1. 在内存中存储n 步骤的数据
  2. 创建数据框并从n 步骤写入数据
  3. 从内存中清除过去的n 步骤数据,并为接下来的n 步骤重复 1 和 2,依此类推...

所以你基本上可以把上面的 sn-ps 想象成循环。我希望在每 n 步数据之后释放内存。我假设在这两种情况下重新声明 data 变量将实现这一点。如果没有,请告知我如何完成此操作,以免内存使用量累积增加。

【问题讨论】:

  • 您是否在将数据帧写入 csv 之前对其进行计算?
  • @HenryEcker 不,我只是创建数据框并写入文件。整个模拟完成后,我会从文件中读取并使用数据帧处理数据。这也是我开始使用数据框进行写作的原因。
  • 如果你有这么多数据,你可以考虑使用二维numpy数组,并在创建数据框时单独传递列名,而不是使用字典/列表。这样,执行其他操作也可能会派上用场。
  • @Don'tAccept True,这也是一种可能。我不确定目前哪个效率最高。

标签: python pandas dataframe


【解决方案1】:

这似乎涵盖了面向行和面向列的数据库。这是一个非常好的答案,涵盖了两者之间的差异。 List with many dictionaries VS dictionary with few lists?

总而言之,当分配面向行的结构时,转换成本更高,因为必须读取每个单独的字典。然而,最好的改进是微不足道的。

【讨论】:

  • 这是有用的信息。感谢分享。它似乎确实表明行操作稍微贵一些。但这并没有真正解决哪个更适合我的用例的问题,我主要关心的是重复操作 - 在内存中维护大量数据并写入文件。
猜你喜欢
  • 2020-07-22
  • 2015-06-23
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多