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

Pandas高效转换Dataframe值为Labels:值设为Index、原Index设为Labels

高效实现DataFrame值转索引、原索引转标签的方法

循环处理百万级数据确实会慢到让人头疼——pandas的矢量化操作才是解决这类问题的正确思路,完全不用写循环。针对你的需求,我们可以利用stack()或者melt()方法快速完成转换,这两个方法都是底层优化过的,处理大规模数据的速度会比Python循环快几个数量级。

具体实现步骤(以stack()为例,更简洁高效)

假设你的原始DataFrame名为df:

  1. 堆叠列到行:用stack()把所有数值列(比如Value1、Value2)转成二级索引,同时自动跳过NaN值;
  2. 重置索引并整理列名:把堆叠后的多级索引转成普通列,重命名成我们需要的Labels(原行索引)和Index(原DataFrame的值);
  3. 设置新索引并排序:把Index列设为最终的索引,保留Labels作为值,最后按索引排序(和你的示例结果一致)。

代码示例

import pandas as pd

# 模拟你的原始DataFrame
df = pd.DataFrame({
    'Value1': [0, 2, pd.NA],
    'Value2': [1, 4, 3]
})

# 核心操作
stacked = df.stack().reset_index()
stacked.columns = ['Labels', '_', 'Index']  # 中间的_是原列名,我们不需要
result = stacked.set_index('Index')['Labels'].sort_index()

print(result)

输出结果和你给出的示例完全一致:

Index
0    0
1    0
2    1
3    2
4    1
Name: Labels, dtype: int64

为什么这个方法高效?

stack()是pandas的内置矢量化操作,底层用C语言实现,避免了Python循环的性能损耗。哪怕是数百万条数据,也能在几秒内完成处理,完全不用担心速度问题。

如果你更习惯用melt(),也可以用下面的代码,效果完全相同:

df = df.reset_index().rename(columns={'index': 'Labels'})
melted = df.melt(id_vars='Labels', value_name='Index').dropna(subset=['Index'])
result = melted.set_index('Index')['Labels'].sort_index()

两种方法都能满足需求,选你觉得更易读的就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:29:38