pandas 如何摆脱python中由于连接太多而导致的分片df的性能警告?

9rnv2umw  于 2023-01-07  发布在  Python
关注(0)|答案(1)|浏览(142)

我有下面的Python代码,我在Databricks中运行了一个按行业分类的月度就业数据df。
下面的代码附加一个空df,计算各行业就业率的年变化率(YoY %),并将每个序列向前移动1到12个月,然后将新估计的序列作为新列添加到原始df中:

> # Forecast df parameters: index, column names
index = pd.date_range('2022-11-30', periods=13, freq='M')
columns = summary_table_empl.columns.to_list()                    

# Append history + empty df 
df_forecast = pd.DataFrame(index=index, columns=columns)
df_test_empl=pd.concat([summary_table_empl, df_forecast])

# New df, calculate yoy percent change for every commodity (col) 
df_CA_empl_test_yoy= ((df_test_empl - df_test_empl.shift(12))/df_test_empl.shift(12))*100

# Extend each variable as a series from 1 to 12 months
for col in df_CA_empl_test_yoy.columns:
   for i in range(1,13):
      df_CA_empl_test_yoy["%s_%s"%(col,i)] = df_CA_empl_test_yoy[col].shift(i)

df_CA_empl_test_yoy.head(15)

代码工作正常,但我得到这个警告:
性能警告:DataFrame碎片很多。这通常是多次调用frame.insert的结果,这样会降低性能。请考虑改用pd. concat(axis = 1)一次联接所有列。若要获得已整理碎片的帧,请使用newframe = frame.copy() df_CA_empl_test_yoy [" % s_ % s" %(col,i)]= df_CA_empl_test_yoy [col]. shift(i)
如何修改代码以消除此警告消息?

jjjwad0x

jjjwad0x1#

您可以使用以下代码段禁止显示警告:

import warnings  warnings.simplefilter(action='ignore', category=pd.errors.PerformanceWarning)

出现该警告是因为您正在使用df_CA_empl_test_yoy["%s_%s"%(col,i)]通过for循环创建新列,每次将新列分配给 Dataframe 时,df_CA_empl_test_yoy["%s_%s"%(col,i)]都会在内部调用.insert()方法。
我看不出有什么方法可以不用for循环来完成这件事,所以关闭警告是可行之道。

相关问题