如何将DataFrame列拆分并将列名转为行内容?
解决DataFrame宽表转长表的方法
针对你给出的DataFrame结构,我们可以利用pandas的melt或wide_to_long函数完成格式转换,以下是两种可行的实现方式:
方法一:分步骤拆分后合并
这种方式逻辑直观,适合新手理解:
import pandas as pd # 1. 构造示例数据 df = pd.DataFrame({ 'id': [1, 2], 'shortTextContent': ['shortContent1', 'shortContent2'], 'shortTextCode': ['shortCode1', 'shortCode2'], 'longPlainTextContent': ['long1', 'long2'], 'longTextCode': ['longCode1', 'longCode2'], 'semiTextContent': ['semiContent1', 'semiContent2'], 'semiTextCode': ['semiCode1', 'semiCode2'] }) # 2. 拆分内容列和编码列 content_df = df.melt( id_vars='id', value_vars=['shortTextContent', 'longPlainTextContent', 'semiTextContent'], var_name='content_category', value_name='content' ) code_df = df.melt( id_vars='id', value_vars=['shortTextCode', 'longTextCode', 'semiTextCode'], var_name='code_category', value_name='code' ) # 3. 匹配内容和编码的分类前缀 code_df['code_category'] = code_df['code_category'].str.replace('Code', '') # 4. 合并并整理结果 result = pd.merge(content_df, code_df, left_on=['id', 'content_category'], right_on=['id', 'code_category']) result = result[['id', 'content_category', 'content', 'code']].sort_values('id').reset_index(drop=True) print(result)
运行后输出:
id content_category content code 0 1 shortTextContent shortContent1 shortCode1 1 1 longPlainTextContent long1 longCode1 2 1 semiTextContent semiContent1 semiCode1 3 2 shortTextContent shortContent2 shortCode2 4 2 longPlainTextContent long2 longCode2 5 2 semiTextContent semiContent2 semiCode2
方法二:使用wide_to_long快速转换
这种方法更简洁,适合熟悉pandas高级函数的用户:
import pandas as pd # 1. 构造示例数据(同方法一) df = pd.DataFrame({ 'id': [1, 2], 'shortTextContent': ['shortContent1', 'shortContent2'], 'shortTextCode': ['shortCode1', 'shortCode2'], 'longPlainTextContent': ['long1', 'long2'], 'longTextCode': ['longCode1', 'longCode2'], 'semiTextContent': ['semiContent1', 'semiContent2'], 'semiTextCode': ['semiCode1', 'semiCode2'] }) # 2. 调整列名格式,让后缀统一为Content/Code df.columns = df.columns.str.replace(r'(.*)(Content|Code)', r'\2_\1', regex=True) # 3. 用wide_to_long转长表 result = pd.wide_to_long( df, stubnames=['Content', 'Code'], i='id', j='content_category', sep='_', suffix='.*' ).reset_index() # 4. 整理列名和顺序 result = result.rename(columns={'Content': 'content', 'Code': 'code'})[['id', 'content_category', 'content', 'code']] print(result)
输出结果和方法一完全一致。
内容的提问来源于stack exchange,提问作者kitten_world
相关产品推荐
相关产品推荐

