如何在单个DataFrame中选择拼接列?代码运行后得到空DataFrame求解
问题分析与修正
你的代码存在几个关键问题,导致输出空DataFrame:
1. 循环变量未初始化
代码中直接使用while i < len(df1.columns),但变量i从未被赋值,循环根本不会执行,df4自然保持初始空状态。
2. pd.concat参数错误
pd.concat需要接收一个DataFrame的列表作为参数,而你传入了两个独立的DataFrame,正确写法是pd.concat([df4, df3])。
3. 列名映射逻辑错误
你错误地重命名了行索引,但实际需求是把每组的3列(比如Column1-3)对应重命名为Letters、Numbers、RomanNumerals,然后将这些组的行纵向拼接。
修正后的代码
import pandas as pd df1 = pd.DataFrame({'Column1': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], 'Column2': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'Column3': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X'], 'Column4': [pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA], 'Column5': ['K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'], 'Column6': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 'Column7': ['XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'], 'Column8': [pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA], 'Column9': ['U', 'V', 'W', 'X', 'Y', 'Z', '', '', '', ''], 'Column10': [21, 22, 23, 24, 25, 26, pd.NA, pd.NA, pd.NA, pd.NA], 'Column11': ['XXI', 'XXII', 'XXIII', 'XXIV', 'XXV', 'XXVI', '', '', '', '']}) column_names = ['Letters', 'Numbers', 'RomanNumerals'] df4 = pd.DataFrame(columns=column_names) i = 0 # 初始化循环变量 while i < len(df1.columns): # 取每组3列 df2 = df1.iloc[:, i:i+3] # 重命名列名 df2.columns = column_names # 过滤掉全空/空字符串的无效行 df2 = df2.dropna(how='all').replace('', pd.NA).dropna(how='all') # 拼接DataFrame df4 = pd.concat([df4, df2], ignore_index=True) i += 4 # 跳过空列,步进4 print(df4)
输出结果
Letters Numbers RomanNumerals 0 A 1 I 1 B 2 II 2 C 3 III 3 D 4 IV 4 E 5 V 5 F 6 VI 6 G 7 VII 7 H 8 VIII 8 I 9 IX 9 J 10 X 10 K 11 XI 11 L 12 XII 12 M 13 XIII 13 N 14 XIV 14 O 15 XV 15 P 16 XVI 16 Q 17 XVII 17 R 18 XVIII 18 S 19 XIX 19 T 20 XX 20 U 21 XXI 21 V 22 XXII 22 W 23 XXIII 23 X 24 XXIV 24 Y 25 XXV 25 Z 26 XXVI
内容的提问来源于stack exchange,提问作者Timeless
相关产品推荐
相关产品推荐

