遍历DataFrame列,每两列拼接生成新DataFrame的问题求助
问题排查与修复方案
原代码的三个核心问题
- 循环范围逻辑错误:原代码遍历所有列索引,导致多数循环的切片超出列范围,完全不符合“每4列取前2列”的需求,应该按步长4循环,只取0、4、8…这类起始位置。
- 列切片范围错误:原切片
i*4:i*4+1遵循Python左闭右开规则,只能取到单列,要获取两列得改成start_idx:start_idx+2。 - 拼接方向错误:默认
pd.concat是行拼接,会把数据纵向堆叠成多行,而我们需要横向拼接列,必须加上axis=1参数。
修复后的代码(基础版)
import pandas as pd # 读取原始数据 df = pd.read_csv(r'C:\Users\zj\Volume-Sampled Export.csv') selected_columns = [] # 按每4列一组,取每组的前2列(0&1、4&5...) for start_idx in range(0, len(df.columns), 4): # 切片取当前组的两列,处理最后一组可能不足2列的情况 cols = df.columns[start_idx:start_idx+2] selected_columns.append(df[cols]) # 横向拼接所有选中的列组 df2 = pd.concat(selected_columns, axis=1) # 保存结果,去掉自动生成的索引列 df2.to_csv(r'C:\Users\zj\totalfeed1.csv', index=False)
优化版(适合大型数据表,效率更高)
不用循环拼接,直接生成所有需要保留的列索引,一次性提取:
import pandas as pd df = pd.read_csv(r'C:\Users\zj\Volume-Sampled Export.csv') # 生成所有需要保留的列索引:0,1,4,5,8,9... keep_cols = [] for start in range(0, len(df.columns), 4): keep_cols.extend([start, start+1]) # 过滤掉超出列数的索引(避免最后一组不足2列报错) keep_cols = [idx for idx in keep_cols if idx < len(df.columns)] # 直接提取目标列 df2 = df.iloc[:, keep_cols] df2.to_csv(r'C:\Users\zj\totalfeed1.csv', index=False)
内容的提问来源于stack exchange,提问作者zhhJll
相关产品推荐
相关产品推荐

