提问人:user16865829 提问时间:9/26/2023 最后编辑:Mark Rotteveeluser16865829 更新时间:10/4/2023 访问量:83
已使用 pd.concat,但仍触发“PerformanceWarning: Dataframe is highly fragmented”
Already use pd.concat but still trigger "PerformanceWarning: Dataframe is highly fragmented"
问:
我在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
现在我有两个问题:
- 为什么会这样?
- 如果我有一个串联的数据帧,并且我想添加更多列,我应该怎么做?再次使用 pd.concat?
顺便说一句,我的问题与这个问题不同。PerformanceWarning:DataFrame 高度碎片化。这通常是多次调用 'frame.insert' 的结果,性能较差
在该问题中,使用 pd.concat 可以防止警告。但是在我的问题中,我已经使用了 pd.concat,之后,再添加一列会在情况 a 和 c 中引起警告。
答:
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。
评论
newframe = frame.copy()
”中关于碎片整理的第二个建议实际上很有帮助。(但这并不能回答关于大小写差异的合法问题 / 和 .)a
c
b