pandas循环拼接DataFrame时如何根据变量名重命名对应列
报错原因
你触发的ValueError: Length mismatch: Expected axis has 2 elements, new values have 1 elements来自两个写法问题:
- 你使用的
df.append()是纵向追加行的逻辑,如果你希望每个遍历到的变量单独作为一列,这个方法本身就用错了,会把所有变量的数值堆叠到同一列下,行数持续累加 - 每次追加的临时DataFrame默认列名都是
0,pandas做拼接时会做隐式列对齐,多次追加后很容易出现列数异常增加的情况,此时你用e.columns = [variable]给全表设置单元素列名列表,就会和实际列数不匹配触发报错。
可直接运行的解决方案
推荐用字典收集所有变量序列,最后一次性生成DataFrame的写法,性能更高,也不会出现列名匹配问题:
import pandas as pd # 按你实际使用的nc处理库调整导入逻辑,比如netCDF4、xarray等 # 读取nc文件、计算目标经纬度对应索引的前置代码保留 # data = 读取到的nc数据集对象 # max_index_lat、max_index_lon 为提前计算好的目标经纬度索引 # 预处理变量列表,保留索引从4开始的目标变量 var_list = list(data.variables.keys()) var_df = pd.DataFrame(var_list, columns=['vari'])[4:].reset_index(drop=True) # 用字典存储「变量名: 固定经纬度下的时序序列」键值对 var_data = {} for _, row in var_df.iterrows(): cur_var = row['vari'] # 提取当前变量在目标经纬度点的所有时间步数值 var_series = data.variables[cur_var][:, max_index_lat, max_index_lon] var_data[cur_var] = var_series # 一次性生成结果表,列名自动对应遍历到的变量名 result_df = pd.DataFrame(var_data)
如果一定要在循环中逐次拼接,注意要做横向拼接,且每次生成临时表时直接指定列名:
# 初始化空结果表 result_df = pd.DataFrame() for _, row in var_df.iterrows(): cur_var = row['vari'] var_series = data.variables[cur_var][:, max_index_lat, max_index_lon] # 临时表直接指定列名为当前变量名 temp_df = pd.DataFrame(var_series, columns=[cur_var]) # 横向拼接 result_df = pd.concat([result_df, temp_df], axis=1)
注意:pandas 1.4及以上版本已经移除了
df.append()方法,统一用pd.concat()实现拼接逻辑。
内容的提问来源于stack exchange,提问作者babak asadolah
相关产品推荐
相关产品推荐

