如何从给定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
相关产品推荐
相关产品推荐

