python 性能警告:DataFrame碎片很大,这通常是多次调用“frame.insert”的结果,这会降低性能

hgqdbh6s  于 2022-12-21  发布在  Python
关注(0)|答案(3)|浏览(406)

我收到以下警告
性能警告:DataFrame碎片很多。这通常是多次调用frame.insert的结果,这会降低性能。请考虑改用pd.concat。若要获得碎片整理后的帧,请使用newframe = frame.copy()
当我尝试添加多个 Dataframe 时

  1. df1 = pd.DataFrame()
  2. for file in files:
  3. df = pd.read(file)
  4. df['id'] = file
  5. df1 = df1.append(df, ignore_index =True)

其中

  1. df['id'] = file

似乎引起了警告。我想知道是否有人能解释copy()如何避免或减少碎片问题,或者建议其他不同的解决方案来避免这些问题。
谢谢你,
我尝试创建测试代码来重现此问题,但在测试数据集(随机整数)中未看到"性能警告"。相同的代码在读取实际数据集时会继续生成警告。看起来像是有什么东西触发了实际数据集中的问题。

  1. import pandas as pd
  2. import numpy as np
  3. import os
  4. import glob
  5. rows = 35000
  6. cols = 1900
  7. def gen_data(rows, cols, num_files):
  8. if not os.path.isdir('./data'):
  9. os.mkdir('./data')
  10. files = []
  11. for i in range(num_files):
  12. file = f'./data/{i}.pkl'
  13. pd.DataFrame(
  14. np.random.randint(1, 1_000, (rows, cols))
  15. ).to_pickle(file)
  16. files.append(file)
  17. return files
  18. # Comment the first line to run real dataset, comment the second line will run the testing dataset
  19. files = gen_data(rows, cols, 10) # testing dataset, runs okay
  20. files = glob.glob('../pickles3/my_data_*.pickle') # real dataset, get performance warning
  21. dfs = []
  22. for file in files:
  23. df = pd.read_pickle(file)
  24. df['id'] = file
  25. dfs.append(df)
  26. dfs = pd.concat(dfs, ignore_index = True)
imzjd6km

imzjd6km1#

append不是此操作的有效方法。concat更适合此情况。
替换

  1. df1 = df1.append(df, ignore_index =True)

  1. pd.concat((df1,df),axis=0)

有关差异的详细信息,请参见此问题:Pandas DataFrame concat vs append

myzjeezk

myzjeezk2#

这是最近更新的问题。请从pandas-dev检查this issue。似乎在pandas版本1.3.1reference PR)中已解决此问题。

jgwigjjp

jgwigjjp3#

我遇到了同样的问题。这引发了PerformanceWarning:

  1. df['col1'] = False
  2. df['col2'] = 0
  3. df['col3'] = 'foo'

这没有:

  1. df[['col1', 'col2', 'col3']] = (False, 0, 'foo')

也许你在其他地方添加了单列?
copy()应该用来合并 Dataframe ,从而整理碎片。2Pandas1.3.1 [GH 42579][1]中有一个错误修正。3在一个更大的 Dataframe 上复制可能会很昂贵。
在panda 1.5.2、python 3.8.15上测试[1]:https://github.com/pandas-dev/pandas/pull/42579

相关问题