如何高效重塑DataFrame:分组横向列转纵向并保留指定列?
高效重塑DataFrame的方法
当然有高效且易维护的方法来完成这个DataFrame重塑需求!下面我会用pandas给出两种实用方案,分别适合不同场景。
方法一:拆分+重命名+拼接(直观易读)
这种方法逻辑清晰,非常适合新手理解,而且处理速度也很高效。核心思路是把A/B/C每组数据单独提取、重命名,再纵向拼接在一起。
首先我们先构造示例数据(模拟你的原始DataFrame):
import pandas as pd data = { 'A1': [11]*6, 'A2': [22]*6, 'A3': [33]*6, 'B1': [44]*6, 'B2': [55]*6, 'B3': [66]*6, 'C1': [77]*6, 'C2': [88]*6, 'C3': [99]*6, 'TT': [23]*6, 'YY': [24]*6, 'ZZ': [25]*6 } df = pd.DataFrame(data)
接下来执行重塑操作:
# 提取A组并重命名列 df_a = df[['A1', 'A2', 'A3', 'TT', 'YY', 'ZZ']].rename(columns={'A1':'HH', 'A2':'JJ', 'A3':'KK'}) # 提取B组并重命名列 df_b = df[['B1', 'B2', 'B3', 'TT', 'YY', 'ZZ']].rename(columns={'B1':'HH', 'B2':'JJ', 'B3':'KK'}) # 提取C组并重命名列 df_c = df[['C1', 'C2', 'C3', 'TT', 'YY', 'ZZ']].rename(columns={'C1':'HH', 'C2':'JJ', 'C3':'KK'}) # 纵向拼接三个子DataFrame,重置索引 result = pd.concat([df_a, df_b, df_c], ignore_index=True)
方法二:批量处理(扩展性强)
如果你的DataFrame后续可能新增D/E等更多组,用循环批量处理会更高效,避免重复写冗余代码:
import pandas as pd # 定义所有需要处理的组 groups = ['A', 'B', 'C'] result_dfs = [] for group in groups: # 构造当前组的列名列表 group_cols = [f'{group}{num}' for num in [1,2,3]] + ['TT', 'YY', 'ZZ'] # 提取列并重命名 temp_df = df[group_cols].rename(columns={ f'{group}1': 'HH', f'{group}2': 'JJ', f'{group}3': 'KK' }) result_dfs.append(temp_df) # 拼接所有处理后的子DataFrame result = pd.concat(result_dfs, ignore_index=True)
验证结果
执行完上述代码后,你可以用print(result)查看最终格式,完全符合你需要的:HH/JJ/KK对应A/B/C组的纵向堆叠,TT/YY/ZZ会自动和每组数据对应重复保留。
内容的提问来源于stack exchange,提问作者zitoun
相关产品推荐
相关产品推荐

