首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"PerformanceWarning: DataFrame是高度分散的。这通常是多次调用`frame.insert`的结果,性能很差。“

"PerformanceWarning: DataFrame是高度分散的。这通常是多次调用`frame.insert`的结果,性能很差。“
EN

Stack Overflow用户
提问于 2021-08-23 00:33:22
回答 1查看 6.4K关注 0票数 2

本质上,我将对df数据中的每一列进行排序,并将其添加到ranking数据中。我显然做得不太有效,我想知道是否有人能为我指明正确的方向。

代码语言:javascript
运行
复制
for x in range(1,num_sims+1):
    ranking[x] = df[x].rank(ascending=False, method='min')

完整的错误消息是:

代码语言:javascript
运行
复制
PerformanceWarning: DataFrame is highly fragmented.  This is usually
the result of calling `frame.insert` many times, which has poor
performance.  Consider using pd.concat instead.  To get a
de-fragmented frame, use `newframe = frame.copy()`   ranking[x] =
df[x].rank(ascending=False, method='min')"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 00:45:34

复制警告的示例:

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd

# Sample `df`
np.random.seed(5)
df = pd.DataFrame(np.random.randint(1, 100, (4, 5000)))
df.columns = df.columns + 1

num_sims = len(df.columns)  # Placeholder for `num_sims`
ranking = pd.DataFrame()  # Placeholder for `ranking`

for x in range(1, num_sims + 1):
    ranking[x] = df[x].rank(ascending=False, method='min')

PerformanceWarning: DataFrame是高度分散的。这通常是多次调用frame.insert的结果,性能很差。考虑一次使用pd.concat(axis=1)连接所有列。要获得一个去碎片的框架,使用newframe = frame.copy() rankingx = dfx.rank(ascending=False,method='min')

使用DataFrame.rankconcat修复:

代码语言:javascript
运行
复制
ranking = pd.DataFrame()  # Placeholder for `ranking`
ranking = pd.concat(
    [ranking, df[range(1, num_sims + 1)].rank(ascending=False, method='min')],
    axis=1
)

output无错误:

代码语言:javascript
运行
复制
   1     2     3     4     5     6     ...  4995  4996  4997  4998  4999  5000
0   2.0   2.0   3.0   1.0   4.0   1.0  ...   3.0   3.0   3.0   4.0   4.0   1.0
1   1.0   1.0   4.0   2.0   3.0   2.0  ...   4.0   1.0   2.0   3.0   1.0   3.0
2   3.0   4.0   1.0   4.0   1.0   4.0  ...   1.0   4.0   1.0   1.0   3.0   4.0
3   4.0   3.0   2.0   3.0   2.0   3.0  ...   2.0   2.0   3.0   2.0   2.0   2.0

*当然,如果ranking是空的,我们可以直接从df创建它

代码语言:javascript
运行
复制
ranking = df[range(1, num_sims + 1)].rank(ascending=False, method='min')

理智地检查它们是否产生相同的结果:

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd

np.random.seed(5)
df = pd.DataFrame(np.random.randint(1, 100, (4, 5000)))
df.columns = df.columns + 1
ranking = pd.DataFrame()
num_sims = len(df.columns)

for x in range(1, num_sims + 1):
    ranking[x] = df[x].rank(ascending=False, method='min')

print(ranking.eq(pd.concat(
    [pd.DataFrame(),
     df[range(1, num_sims + 1)].rank(ascending=False, method='min')],
    axis=1
)).all(axis=None))  # True
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68886155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档