You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动