使用pyIGRF计算IGRF并导出CSV时数据参数全部相同的问题
问题分析与解决
你的代码问题出在循环赋值的逻辑上,核心错误有两个:
- 内层
for j in x:完全多余,它会让每次计算的结果重复给整列赋值多次,完全没必要 - 直接写
df['Inc']=Inc是把整列所有行都设成当前循环的Inc值,而不是只给第i行赋值,所以最后所有行都会变成最后一次循环的计算结果
另外注意:pyIGRF的igrf_value第一个参数是经度(longitude),你代码里写的df['lan'][i]大概率是拼写错误,应该改成df['lon'][i],否则计算结果会出错。
修正后的代码(循环方式)
如果一定要用循环,需要给对应行赋值:
import pyIGRF import os import pandas as pd os.chdir('D:/IGRF') df = pd.read_csv('igrf.csv') # 先初始化要新增的列,避免重复创建 df['Inc'] = 0.0 df['Dec'] = 0.0 df['total'] = 0.0 for i in range(len(df)): # 注意这里把lan改成lon,确保是经度 Inc, Dec, Hi, Xn, Yn, Zn, totalmag = pyIGRF.igrf_value(df['lon'][i], df['lat'][i], df['alt'][i], 2022) # 给第i行的对应列赋值,而不是整列 df.loc[i, 'Inc'] = Inc df.loc[i, 'Dec'] = Dec df.loc[i, 'total'] = totalmag print(df) df.to_csv('IGRF_end.csv', index=False) # 加上index=False避免导出多余的索引列
更高效的方式(推荐用pandas apply)
pandas不建议手动循环行,用apply更简洁高效:
import pyIGRF import os import pandas as pd os.chdir('D:/IGRF') df = pd.read_csv('igrf.csv') def calculate_igrf(row): # 同样注意经度参数是lon Inc, Dec, Hi, Xn, Yn, Zn, totalmag = pyIGRF.igrf_value(row['lon'], row['lat'], row['alt'], 2022) return pd.Series([Inc, Dec, totalmag], index=['Inc', 'Dec', 'total']) # 把计算结果合并到原DataFrame df[['Inc', 'Dec', 'total']] = df.apply(calculate_igrf, axis=1) print(df) df.to_csv('IGRF_end.csv', index=False)
这样修改后,每一行都会对应自己的计算结果,不会出现所有参数相同的问题了。
内容的提问来源于stack exchange,提问作者Amin Karimi
相关产品推荐
相关产品推荐

