如何用Pivot Table或其他方法在Python中转换指定结构的DataFrame
解决方案:用Pandas重塑DataFrame结构
这是一个典型的宽表转特定长表的重塑需求,用Pandas的转置+列名调整就能完美实现,我给你一步步拆解代码和逻辑:
步骤1:准备示例数据(模拟你的原DataFrame)
先模拟一个简化版的原数据方便测试,你可以直接替换成自己的真实数据:
import pandas as pd import numpy as np # 生成100行数据,Text列用"text_1"到"text_100",Val列是随机0/1 data = { 'sr#': range(1, 101), 'Text': [f'text_{i}' for i in range(1, 101)], } # 添加Val1到Val100列 for i in range(1, 101): data[f'Val{i}'] = np.random.randint(0, 2, size=100) df = pd.DataFrame(data)
步骤2:核心转换代码
# 1. 筛选所有Val开头的列,转置后把列名替换为原Text列的内容 val_columns = [col for col in df.columns if col.startswith('Val')] transposed_df = df[val_columns].T transposed_df.columns = df['Text'].tolist() # 2. 重置索引,生成Values列和新的sr#列 transposed_df.reset_index(inplace=True) transposed_df.rename(columns={'index': 'Values'}, inplace=True) transposed_df['sr#'] = range(1, len(transposed_df)+1) # 3. 调整列顺序,让sr#和Values列排在最前面 final_df = transposed_df[['sr#', 'Values'] + df['Text'].tolist()]
代码逻辑解释
- 筛选并转置Val列:先把所有
Val开头的列提取出来转置,这样原来的每一个Val列就变成了一行,正好对应你要的Values行内容。 - 替换列名为Text值:把转置后的列名替换成原DataFrame每行的
Text内容,直接实现你要的文本列名需求。 - 添加sr#和Values列:重置索引后把原索引(Val1/Val2...)改成
Values列,再生成从1到100的新sr#列。 - 调整列顺序:确保最终DataFrame的列顺序和你要求的一致。
验证结果
你可以打印final_df.head()查看前几行,结构完全符合你的要求:
sr# Values text_1 text_2 text_3 ... text_98 text_99 text_100 0 1 Val1 1 0 1 ... 0 1 0 1 2 Val2 1 0 0 ... 1 0 1 2 3 Val3 1 0 1 ... 0 1 0 3 4 Val4 0 1 1 ... 1 0 1
内容的提问来源于stack exchange,提问作者codingXP




