根据其他字段的计算,在pandas数据框中一次创建两个新字段

时间:2020-05-07 19:01:58

标签: python python-3.x 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字段。

我也尝试过在行迭代器中分配新字段,但是由于我处于行规模,因此每次都会用新的计算值覆盖整个列。

如何获取结果(简洁地)填充列?

2 个答案:

答案 0 :(得分:1)

似乎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可以确保对原始数据帧进行了更改。

答案 1 :(得分:0)

我认为您最好使用<div><button class="some_class" style="display:block" onclick="hidenow('hideit')" name="programma" type="submit" value="<?php echo esc_attr( $retrieved_data->Anaam ); ?>">Abonneer</button></div> 而不是apply

这是基于iterrows的解决方案。我用名为“ foo”的函数替换了您的位置计算,该函数对两个字段“ a”和“ b”到“ a”和“ b”的新值进行了一些任意计算。

apply

在上面的代码块中,应用'foo'将为每行返回一个元组。再次将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) apply一起使用将其转换为数据帧。

pd.Series