You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从给定DataFrame的行值生成多个结构转换后的子DataFrame?

解决方案

方法1:循环生成单个DataFrame(直观易理解)

直接遍历原数据的每一行,提取对应科目的X/Y系列值,构造目标结构的子DataFrame:

import pandas as pd

# 原数据
df = pd.DataFrame({
    'subject': ['A', 'B', 'C', 'D'],
    'X1': [80, 90, 70, 60],
    'Y1': [10, 25, 20, 15],
    'X2': [63, 75, 84, 92],
    'Y2': [13, 28, 25, 18],
    'X3': [36, 78, 64, 82],
    'Y3': [18, 25, 24, 16]
})

# 遍历生成每个科目对应的DataFrame
for _, row in df.iterrows():
    sub = row['subject']
    # 提取X1/X2/X3和Y1/Y2/Y3的数值列表
    x_list = [row['X1'], row['X2'], row['X3']]
    y_list = [row['Y1'], row['Y2'], row['Y3']]
    # 赋值到全局变量(如df_A、df_B)
    globals()[f'df_{sub}'] = pd.DataFrame({'X': x_list, 'Y': y_list})

# 验证输出
print(df_A)

方法2:批量处理(更规范,推荐用字典管理)

如果不想生成大量全局变量,建议将结果存入字典,便于后续调用:

import pandas as pd

df = pd.DataFrame({
    'subject': ['A', 'B', 'C', 'D'],
    'X1': [80, 90, 70, 60],
    'Y1': [10, 25, 20, 15],
    'X2': [63, 75, 84, 92],
    'Y2': [13, 28, 25, 18],
    'X3': [36, 78, 64, 82],
    'Y3': [18, 25, 24, 16]
})

# 1. 将宽表转为长表,保留subject标识
melted_df = df.melt(id_vars='subject', var_name='col', value_name='val')
# 2. 拆分列名中的X/Y和数字后缀(如X1拆成X和1)
melted_df[['xy', 'num']] = melted_df['col'].str.extract(r'([XY])(\d)')
# 3. 重塑为目标结构,按科目分组
pivoted = melted_df.pivot(index=['subject', 'num'], columns='xy', values='val').reset_index(drop=True)
# 4. 按科目拆分存入字典
sub_dfs = {f'df_{s}': group for s, group in pivoted.groupby('subject')}

# 调用示例
print(sub_dfs['df_A'])

关于iloc失败的原因

iloc仅能按位置提取整行/整列数据,但你的需求是将单行中的多组Xn/Yn值拆分为多行,单纯用iloc无法完成数据的重塑,必须先提取对应列的数值,再重新构造多行结构的DataFrame。

内容的提问来源于stack exchange,提问作者S N B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:29:49