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

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

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

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

其中

df['id'] = file

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

import pandas as pd
import numpy as np
import os
import glob
rows = 35000
cols = 1900
def gen_data(rows, cols, num_files):
    if not os.path.isdir('./data'):
        os.mkdir('./data')
        files = []
        for i in range(num_files):
            file = f'./data/{i}.pkl'
            pd.DataFrame(
                np.random.randint(1, 1_000, (rows, cols))
            ).to_pickle(file)
            files.append(file)
    return files

# Comment the first line to run real dataset, comment the second line will run the testing dataset
files = gen_data(rows, cols, 10) # testing dataset, runs okay
files = glob.glob('../pickles3/my_data_*.pickle') # real dataset, get performance warning

dfs = []
for file in files:
    df = pd.read_pickle(file)
    df['id'] = file

    dfs.append(df)

dfs = pd.concat(dfs, ignore_index = True)
imzjd6km

imzjd6km1#

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

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

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:

df['col1'] = False
df['col2'] = 0
df['col3'] = 'foo'

这没有:

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

相关问题