我将一系列csv文件作为数据框进行迭代,最终将它们全部写到一个通用的excel工作簿中。
在许多文件之一中,有十进制GPS值(纬度,经度)分为两列(df[4]
和df[5]
),我将其转换为度-分-秒。该方法返回一个元组,我试图将其存储在原始数据帧的同一行中的两个新字段中,分别称为dmslat
和dmslon
:
def convert_dd_to_dms(lat, lon):
# does the math here
return dmslat, dmslon
csv_dir = askdirectory() # tkinter directory picker
os.chdir(csv_dir)
for f in glob.iglob("*.csv"):
(csv_path, csv_name) = os.path.split(f)
(csv_prefix, csv_ext) = os.path.splitext(csv_name)
if csv_prefix[-3:] == "loc":
df = pd.read_csv(f)
df['dmslat'] = None
df['dmslon'] = None
for i, row in df.iterrows():
fixed_coords = convert_dd_to_dms(row[4], row[5])
row['dmslat'] = fixed_coords[0]
row['dmslon'] = fixed_coords[1]
print(df)
# process the other files
所以当我使用print()
语句时,我可以看到坐标已正确计算,但是它们并未提交给dmslat
/ dmslon
字段。
我也尝试过在行迭代器内分配新字段,但是由于我处于行规模,因此每次都会用新的计算值覆盖整个列。
如何获得结果以(简洁地)填充列?
似乎df.iterrows()导致每一行的“副本”,因此,当您添加列“ dmslat”和“ dmslon”时,您正在修改副本,而不是原始数据帧。可以通过在分配任务后打印“行”来确认。
要修改原始数据框,您可以这样修改代码:
for i, row in df.iterrows():
fixed_coords = convert_dd_to_dms(row[4], row[5])
df.loc[i, 'dmslat'] = fixed_coords[0]
df.loc[i, 'dmslon'] = fixed_coords[1]
print(df)
使用df.loc
保证对原始数据帧进行了更改。
数据框中的其他行将具有“ N / A”