如何拆分DataFrame首行字符串并转换为目标数据格式
DataFrame列名拆分与重塑方案
问题场景
导入的数据集列名为数字序号,首行(索引1的行)单元格字符串均以Area、Mean、StdDev开头,括号内包含不同标签内容。需将字符串按括号拆分,把前缀设为列标题,括号内内容设为行标签,最终转换为目标格式。
初始数据格式:
import pandas as pd df1 = pd.DataFrame({ 1: {'1': "Area(E10_1_nucleus)", '2': 435}, 2: {'1': "Mean(E10_1_nucleus)", '2': 313}, 3: {'1': "StdDev(E10_1_nucleus)", '2': 150}, 4: {'1': "Area(E10_1_cytoplasm)", '2': 635}, 5: {'1': "Mean(E10_1_cytoplasm)", '2': 847}, 6: {'1': "StdDev(E10_1_cytoplasm)", '2': 321}})
期望中间格式df2:
df2= pd.DataFrame({ 1: {'1': "Area", '2':'E10_1_nucleus','3': 435}, 2: {'1': "Mean",'2':'E10_1_nucleus' ,'3': 313}, 3: {'1': "StdDev",'2':'E10_1_nucleus' ,'3': 150}, 4: {'1': "Area",'2':'E10_1_cytoplasm' ,'3': 635}, 5: {'1': "Mean",'2':'E10_1_cytoplasm' ,'3': 847}, 6: {'1': "StdDev",'2':'E10_1_cytoplasm' ,'3': 331}})
最终目标格式df3:
df3= pd.DataFrame({ 'Label': {'1':'E10_1_nucleus' ,'2':'E10_1_cytoplasm' }, 'Area': {'1': 435,'2':635}, 'Mean': {'1': 313,'2':847}, 'StdDev': {'1': 150,'2':331}})
实现方法
1. 生成中间格式df2
# 提取首行数据并拆分前缀与标签 split_data = df1.loc['1'].str.extract(r'(\w+)\((\w+)\)') # 创建包含拆分结果的新行 new_rows = pd.DataFrame([split_data[0], split_data[1]], index=['1_new', '2_new']) # 合并新行与原数据,重置索引匹配df2格式 df2 = pd.concat([new_rows, df1]).reindex(['1_new', '2_new', '2']) df2.index = ['1', '2', '3'] df2.columns = df1.columns
2. 直接生成最终格式df3(高效路径)
无需经过df2,直接从df1转换:
# 转置df1,将原列转为行处理 df_transposed = df1.T.reset_index(drop=True) # 拆分首列字符串,提取指标(Area/Mean/StdDev)和标签 df_transposed[['Metric', 'Label']] = df_transposed[1].str.extract(r'(\w+)\((\w+)\)') # 重塑为目标宽表格式 df3 = df_transposed.pivot(index='Label', columns='Metric', values=2).reset_index() df3.columns.name = None
运行以上代码即可得到目标格式的df3。
内容的提问来源于stack exchange,提问作者Karina
相关产品推荐
相关产品推荐

