已使用 pd.concat,但仍触发“PerformanceWarning: Dataframe is highly fragmented”

Already use pd.concat but still trigger "PerformanceWarning: Dataframe is highly fragmented"

提问人:user16865829 提问时间:9/26/2023 最后编辑:Mark Rotteveeluser16865829 更新时间:10/4/2023 访问量:83

问:

我在Python pandas中遇到了一个奇怪的行为。为了防止“Dataframe is highly fragmented”警告,我已经使用了 pd.concat。但在那之后,当我在连接的数据帧中再添加一列时,在某些情况下可能会显示警告。

案例 a:将一个空 df 与多个系列连接起来。然后再添加一列。警告。

案例 b:连接多个系列,然后再添加一列。没事的。

案例 c:连接多个 dfs,然后再添加一列。警告。

import pandas as pd
import sys

print(sys.version)  # 3.8.11
print('pandas version: ',pd.__version__)  # pandas version:  2.0.3

list_of_series = [pd.Series([1,2,3]) for i in range(200)]

a = pd.DataFrame()
a = pd.concat([a]+list_of_series,axis=1)
a['one_more_col'] = [4,5,6]  # concating one df with many series incurs warning

b = pd.concat(list_of_series,axis=1)
b['one_more_col'] = [4,5,6]  # concating series only. It's fine.

c = pd.concat([pd.DataFrame(x) for x in list_of_series],axis=1,)
c['one_more_col'] = [4,5,6]  # concating many dataframes incurs warning

现在我有两个问题:

  1. 为什么会这样?
  2. 如果我有一个串联的数据帧,并且我想添加更多列,我应该怎么做?再次使用 pd.concat?

顺便说一句,我的问题与这个问题不同。PerformanceWarning:DataFrame 高度碎片化。这通常是多次调用 'frame.insert' 的结果,性能较差

在该问题中,使用 pd.concat 可以防止警告。但是在我的问题中,我已经使用了 pd.concat,之后,再添加一列会在情况 a 和 c 中引起警告。

Python Pandas DataFrame 串联 警告

评论

0赞 bb1 9/26/2023
这回答了你的问题吗?PerformanceWarning:DataFrame 高度碎片化。这通常是多次调用 'frame.insert' 的结果,性能较差
0赞 user16865829 9/26/2023
@bb1 也许不是。 因为我已经使用了链接中推荐的 pd.concat。
0赞 Timus 9/26/2023
警告“要获得碎片整理的帧,请使用 newframe = frame.copy()中关于碎片整理的第二个建议实际上很有帮助。(但这并不能回答关于大小写差异的合法问题 / 和 .)acb

答:

0赞 jtobelem 10/4/2023 #1

在案例 a 中,您正在将 DataFrame 与系列列表合并。它将保留对可以修改的数据帧 a 的引用:

a = pd.DataFrame()
new_a = pd.concat([a]+list_of_series,axis=1)

那么 a 和 new_a 共享相同的数据,您应该避免这种情况。

考虑使用 assign 来添加新的列:

a = pd.concat(list_of_series,axis=1)
a = a.assign(one_more_col= pd.Series([4,5,6]))

它也适用于情况 b 和 c。