如何基于girth值为Pandas Series指定索引名加前缀并转单列DataFrame?
解决方案
直接上可运行的代码,一步到位:
import pandas as pd # 原始数据 df_single_level_cols = pd.DataFrame([[0, 1, 20], [2, 3, 40]], columns=['weight', 'height', 'girth']) # 1. 提取每行的girth值(转成字符串方便拼接前缀) girth_values = df_single_level_cols['girth'].astype(str) # 2. 给weight和height列名匹配对应行的girth前缀 renamed_cols = { 'weight': girth_values + 'weight', 'height': girth_values + 'height' } # 3. 提取目标列、重命名、转成单列并整理格式 temp = df_single_level_cols[['weight', 'height']].rename(columns=renamed_cols).stack() result = temp.to_frame(name='Data') result.index = temp.index.get_level_values(1) print(result)
运行后输出完全符合你的需求:
Data 20weight 0 20height 1 40weight 2 40height 3
分步说明
- 提取前缀源:把
girth列转成字符串类型,确保能和列名直接拼接。 - 动态重命名列:利用Pandas的广播特性,让每行的
weight/height列名自动匹配对应行的girth值作为前缀。 - 转成单列结构:用
stack()把多列折叠成一维Series,再提取带前缀的索引作为最终DataFrame的索引。
针对你之前尝试方法的补充
你之前用df[0].add_prefix("test")报错,是因为stack后的Series里,df[0]是取索引为0的元素而非子系列。如果非要基于stack后的结构处理,可以用分组的方式:
df = df_single_level_cols.stack() # 按外层索引分组,每组内处理 processed = df.groupby(level=0).apply( lambda group: group.drop('girth').rename(lambda idx: f"{group['girth']}{idx}") ) # 整理成目标DataFrame result_df = processed.reset_index(level=0, drop=True).to_frame('Data')
两种方法都能实现需求,第一种不需要先stack再处理,效率更高。
内容的提问来源于stack exchange,提问作者user15227672
相关产品推荐
相关产品推荐

