Pandas如何修改列内文本值并合并首行内容与列名?
Pandas DataFrame 列名重构与值替换方案
初始测试数据
先运行如下代码复现初始DataFrame:
import pandas as pd data={'a1':['X1',2,3,4,5],'Unnamed: 02':['Y1',5,6,7,8],'b1':['X2',5,3,7,9],'Unnamed: 05':['Y2',5,8,9,3],'c1':['X3',4,5,7,5],'Unnamed: 07':['Y3',5,8,9,3],'d1':['P',2,4,5,7],'Unnamed: 09':['M',8,4,6,7]} df=pd.DataFrame(data) # 向前填充列名,处理Unnamed空列名 df.columns=df.columns.to_series().mask(lambda x: x.str.startswith('Unnamed')).ffill()
处理规则
- 文本值替换:全局将
X1/X2/X3统一替换为X,Y1/Y2/Y3统一替换为Y - 列名重构:提取第一行的标识位,若标识为
P/M则直接作为新列名;其余标识先做统一替换,再和原列名拼接为原列名_标识的格式,最后删除作为临时表头的第一行。
完整实现代码
# 定义值替换映射关系 replace_map = {'X1':'X', 'X2':'X', 'X3':'X', 'Y1':'Y', 'Y2':'Y', 'Y3':'Y'} # 提取首行标识,提前做值替换用于生成新列名 header_tags = df.iloc[0].replace(replace_map) # 遍历生成新列名 new_columns = [] for origin_col, tag in zip(df.columns, header_tags): if tag in ('P', 'M'): new_columns.append(tag) else: new_columns.append(f"{origin_col}_{tag}") # 应用新列名、删除首行、全局执行值替换 df.columns = new_columns df = df.iloc[1:].reset_index(drop=True) df = df.replace(replace_map)
处理后效果
最终得到的DataFrame列名依次为a1_X、a1_Y、b1_X、b1_Y、c1_X、c1_Y、P、M,所有单元格内的X、Y类文本已完成统一替换,剩余行均为有效数值数据。
内容的提问来源于stack exchange,提问作者Win Yen Tham
相关产品推荐
相关产品推荐

