基于其他字段的计算,在pandas数据帧中同时创建两个新字段



我正在迭代一系列csv文件作为数据帧,最终将它们全部写入一个通用的excel工作簿。

在众多文件中的一个文件中,有十进制GPS值(纬度、经度(,分为两列(df[4]df[5](,我将其转换为度-分-秒。该方法返回一个元组,我正试图将其存放在原始数据帧的同一行中的两个名为dmslatdmslon的新字段中:

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"one_answers"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)

使用CCD_ 8保证对原始数据帧进行更改。

我认为您最好使用apply而不是iterrows

以下是一个基于apply的解决方案。我用一个名为"foo"的函数替换了您的位置计算,该函数从两个字段"a"one_answers"b"到"a"或"b"的新值进行任意计算。

df = pd.DataFrame({"a": range(10), "b":range(10, 20)})
def foo(row):
return (row["a"] + row["b"], row["a"] * row["b"])
new_df = df.apply(foo, axis=1).apply(pd.Series)

在上面的代码块中,应用"foo"为每一行返回一个元组。与pd.Series一起再次使用apply将其变成数据帧。

df[["a", "b"]] = new_df
df.head(3) 
a   b
0   10  0
1   23  132
2   38  336

最新更新