使用Pandas复制DataFrame数据至新表时Excel输出为空的问题
问题排查与解决方案
代码中的核心问题
- 空DataFrame初始化错误:你创建了空的
out和out2,但未将原始df的数据赋值给out,导致后续遍历out.columns时无任何列可处理,自然不会复制数据。 - 映射逻辑完全不匹配:映射规则里用的是
i="1"、j="2",但原始列名后缀是42、43、44这类数字,条件if f"{mapping_key}{mapping_values['i']}" in column永远不会触发。 - 语法错误:
mappings字典中latitude的定义缺少闭合大括号,out2 = pd.DataFrame(columns=column_names_out2也缺少右括号,这些错误会直接导致代码运行失败。 - 变量混淆:定义了含数据的
df但未使用,反而基于空的out执行后续操作。
修复后的实现方案
手动映射(列数较少时)
如果列名对应关系明确,直接手动定义映射表:
import pandas as pd # 原始数据 df = pd.DataFrame({ 'nodeBLocalCellId_42': ['A3', 'A0', 'B3'], 'configuredMaxTxPower_3G_43': [40000, 50000, 42000], 'latitude_44': [40000, 50000, 42000], 'nodeBLocalCellId_46': [40000, 50000, 42000], 'configuredMaxTxPower_3G_47': [40000, 50000, 42000], 'latitude_48': [40000, 50000, 42000] }) # 定义原始列与目标列的对应关系 col_mapping = { 'nodeBLocalCellId_42': 'nodeBLocalCellId_1', 'configuredMaxTxPower_3G_43': 'configuredMaxTxPower_3G_1', 'latitude_44': 'latitude_1', 'nodeBLocalCellId_46': 'nodeBLocalCellId_2', 'configuredMaxTxPower_3G_47': 'configuredMaxTxPower_3G_2', 'latitude_48': 'latitude_2' } # 重命名列生成out2 out2 = df.rename(columns=col_mapping) # 导出Excel(index=False避免写入行索引) out2.to_excel('/path.xlsx', index=False)
批量自动映射(列数较多且规律时)
如果列是按每3组批量生成的(如原始后缀为42+3n、43+3n、44+3n,目标为_1、_2...),可以自动生成映射:
import pandas as pd df = pd.DataFrame({ 'nodeBLocalCellId_42': ['A3', 'A0', 'B3'], 'configuredMaxTxPower_3G_43': [40000, 50000, 42000], 'latitude_44': [40000, 50000, 42000], 'nodeBLocalCellId_46': [40000, 50000, 42000], 'configuredMaxTxPower_3G_47': [40000, 50000, 42000], 'latitude_48': [40000, 50000, 42000] }) # 批量生成列映射 col_mapping = {} # 按每3列一组拆分原始列 groups = [df.columns[i:i+3] for i in range(0, len(df.columns), 3)] for idx, group in enumerate(groups, start=1): for col in group: # 提取列名前缀(去掉最后的数字后缀) prefix = '_'.join(col.split('_')[:-1]) col_mapping[col] = f"{prefix}_{idx}" out2 = df.rename(columns=col_mapping) out2.to_excel('/path.xlsx', index=False)
关键修复说明
- 基于真实数据操作:直接使用含数据的
df,不再创建空的无效DataFrame。 - 精准列映射:确保原始列与目标列的对应关系完全匹配,避免无效条件判断。
- 使用pandas内置方法:
rename方法比手动循环更高效且不易出错。 - 修复语法错误:确保所有字典、括号闭合,代码可正常运行。
内容的提问来源于stack exchange,提问作者Prashant Sharma
相关产品推荐
相关产品推荐

