python表格定位读取程序
定义函数
给定一个值与列表,首先判断值是否在列表范围内,其次判断列表是否为正序排列,若为逆序则使其倒序。
最后利用bisect_left获取与值最相近的左边的数值
import pandas as pd
from bisect import bisect_left
def takeClosest(myList, myNumber):
if myNumber >= max(myList):
return max(myList)
elif myNumber <= min(myList):
return min(myList)
if myList[0] < myList[1]:
pos = bisect_left(myList, myNumber) # 找到 mylist 里面第一个不比 mynumber 小(即 >= )的数的索引下标
# 返回的插入点 pos 可以将数组myList分成两部分。左侧是 all(val < x for val in myList[lo:i]) ,右侧是 all(val >= x for val in myList[i:hi])
before = myList[pos - 1]
after = myList[pos]
if after - myNumber < myNumber - before:
return after
else:
return before
else:
myList = myList[::-1]
pos = takeClosest(myList, myNumber)
return pos
以经纬度表格为例,
纬度作为第一列可直接拽取为列表,但经度由于是第一行已被固定为索引字符串,无法形成列表读取数值进行处理。所以需要利用map函数进行转化获得float浮点型数值,进而获得列表。
最后表格定位获取数据即可
def soilcatch(lat, lon, data):
lat = takeClosest(list(data['Unnamed: 0']),lat)
lon = takeClosest(list(map(float, list(data.columns)[1:])),lon)
soildata = data.loc[data['Unnamed: 0']==lat,str(lon)]
return soildata.iloc[0]
实际使用
datas = pd.read_csv('henanBD.csv')
print(soilcatch(34.5,112.5,datas))