Pandas如何对CSV每行经纬度数据应用公式批量生成复数列表
问题说明
我有一份存储全美城市经纬度信息的CSV文件,读取数据的初始代码如下:
%matplotlib inline from __future__ import division # from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np import random import time import itertools import urllib import csv import pandas as pd df = pd.read_csv("USA_BIG_MAP.csv") df.loc[0:6] df.dtypes
读取到的前7行数据样例:
ID LAT LON Location 0 [ANB] 33.58 85.85 Anniston,AL 1 [AUO] 32.67 85.44 Auburn,AL 2 [BHM] 33.57 86.75 Birmingham,AL 3 [CKL] 32.90 87.25 Centreville,AL 4 [DHN] 31.32 85.45 Dothan,AL 5 [OZR] 31.28 85.72 Fort 6 [GAD] 33.97 86.09 Gadsden,AL
各字段数据类型:
ID object LAT float64 LON float64 Location object dtype: object
我的目标是把每个城市的纬度、经度代入自定义的City复数计算公式,输出完整复数列表用于后续可视化,复数相关定义代码如下:
Point = complex City = Point def X(point): "点的x坐标" return point.real def Y(point): "点的y坐标" return point.imag # 待填充的公式模板 formula = City(69 * float( **XX LAT XX** ), -49 * float( **XX LON XX** )) print(formula)
目前我只会写单行计算的代码,无法批量处理所有行生成列表,单行计算示例:
formula_example = City(69 * float(df.loc[1, 'LAT']), -49 * float(df.loc[1, 'LON'])) formula_example
单行运行输出:
(2254.23-4186.5599999999995j)
实现方法
你的数据里LAT和LON列已经是float64类型,不需要额外套float()做类型转换,两种常用实现方式如下:
- 向量化运算(推荐,数据量大时运行效率远高于逐行循环)
# 直接批量生成复数,可存入DataFrame关联城市属性 df['city_complex'] = 69 * df['LAT'] - 49 * df['LON'] * 1j # 导出为纯Python列表供后续使用 city_complex_list = df['city_complex'].tolist()
- 逐行遍历(逻辑和你写的单行计算完全一致,新手更容易理解)
city_complex_list = [] for _, row in df.iterrows(): current_city = City(69 * row['LAT'], -49 * row['LON']) city_complex_list.append(current_city)
两种方式生成的列表完全一致,你之前计算的索引1位置的Auburn城市复数结果,和列表对应位置的输出匹配,可以直接用于后续可视化开发。
内容的提问来源于stack exchange,提问作者John Denn
相关产品推荐
相关产品推荐

