我收到以下警告
性能警告: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)
3条答案
按热度按时间imzjd6km1#
append
不是此操作的有效方法。concat
更适合此情况。替换
与
有关差异的详细信息,请参见此问题:Pandas DataFrame concat vs append
myzjeezk2#
这是最近更新的问题。请从
pandas-dev
检查this issue。似乎在pandas
版本1.3.1
(reference PR)中已解决此问题。jgwigjjp3#
我遇到了同样的问题。这引发了PerformanceWarning:
这没有:
也许你在其他地方添加了单列?
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