You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效删除DataFrame中排列后重复的多重索引?

高效处理DataFrame中排列重复的索引条目

针对你需要删除排列后重复的索引条目(比如"FITB RF"和"RF FITB"视为重复)的需求,这里有一套适合大数据集的高效解决方案,核心思路是先标准化索引,再分组去重,全程用矢量化操作避免低效循环:

步骤1:标准化索引,让排列重复的索引生成相同的键

我们可以把每个索引字符串拆分成两个元素,按字母顺序排序后重新拼接,这样任何排列组合的索引都会变成完全一致的标准化键。比如"RF FITB"会被转换成"FITB RF",和原索引中的"FITB RF"键值相同。

步骤2:分组保留目标行

根据标准化键分组后,你可以选择保留每组中符合需求的行——比如你的示例里保留了adf值最小(绝对值最大)的行,或者也可以保留每组中第一个出现的行,具体看你的业务需求。

完整代码示例

import pandas as pd
import numpy as np

# 你的原始DataFrame
data = {
    'Correlations': [0.984395, 0.981778, 0.981778, 0.984395, 0.973801],
    'adf': [-5.484766, -5.465284, -5.420976, -5.175268, -4.919812]
}
index = ['FITB RF', 'WAT SWK', 'SWK WAT', 'RF FITB', 'MCO BK']
df = pd.DataFrame(data, index=index)

# 高效生成标准化索引键(用numpy矢量化排序,比apply更快)
split_idx = df.index.str.split(' ', expand=True).to_numpy()
sorted_idx = np.sort(split_idx, axis=1)
standardized_keys = [' '.join(row) for row in sorted_idx]

# 分组并保留每组中adf最小的行(和你的示例结果匹配)
df_cleaned = df.groupby(standardized_keys).apply(lambda x: x.loc[x['adf'].idxmin()])

# 清理索引,恢复成你需要的格式
df_cleaned = df_cleaned.reset_index(level=0, drop=True)

print(df_cleaned)

运行后输出结果就是你想要的:

Correlations       adf
FITB RF         0.984395 -5.484766
WAT SWK         0.981778 -5.465284
MCO BK          0.973801 -4.919812

效率说明

这套方案全程用pandas和numpy的矢量化操作,避免了逐行循环,处理大数据集时性能会比普通循环高很多。如果你的数据集特别大,还可以尝试用df.index.str.split结合np.sort的方式进一步提速,因为numpy的排序是底层优化过的,比pandas的apply更高效。

内容的提问来源于stack exchange,提问作者Marchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:03:23