Pandas高效转换Dataframe值为Labels:值设为Index、原Index设为Labels
高效实现DataFrame值转索引、原索引转标签的方法
循环处理百万级数据确实会慢到让人头疼——pandas的矢量化操作才是解决这类问题的正确思路,完全不用写循环。针对你的需求,我们可以利用stack()或者melt()方法快速完成转换,这两个方法都是底层优化过的,处理大规模数据的速度会比Python循环快几个数量级。
具体实现步骤(以stack()为例,更简洁高效)
假设你的原始DataFrame名为df:
- 堆叠列到行:用
stack()把所有数值列(比如Value1、Value2)转成二级索引,同时自动跳过NaN值; - 重置索引并整理列名:把堆叠后的多级索引转成普通列,重命名成我们需要的
Labels(原行索引)和Index(原DataFrame的值); - 设置新索引并排序:把
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
相关产品推荐
相关产品推荐

