找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2724|回复: 2

[求助] python按条件筛选

5

主题

14

帖子

14

积分

贫民

积分
14
sally786 发表于 2017-12-11 22:46:09 | 显示全部楼层 |阅读模式
                cluster  longitude  latitude    YN
city                                         
Beijing          1     116.46     39.92  True
Shanghai         1     121.48     31.22  True
Guangzhou        1     113.23     23.16  True
Shenzhen         1     114.07     22.62  True
Chengdu          2     104.06     30.67  True
Maanshan        4     118.48     31.56  False
Nanchong        4     106.11     30.84  False
Xining        4     101.74     36.56  True
Xiaogan        4     113.91     31.92  False
Qiqihaer         4     123.97     47.33  True

def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)  
    # 将十进制度数转化为弧度  
    lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2])  

    # haversine公式  
    dlon = lon2 - lon1   
    dlat = lat2 - lat1   
    a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2  
    c = 2 * math.asin(math.sqrt(a))   
    r = 6371 # 地球平均半径,单位为公里  
    return c * r
数据如上,中间还有一些省略掉了 就是一些城市的经纬度和几线城市

现在想让yn=false的先找到同一类cluster的,然后把经纬度取出来,跟同一类cluster yn=true的地方做距离计算,取haversine最小值 返回离这个城市名
比如 nanchong yn=false 她的cluster=4 在第四类找到yn=true的地方的经纬度 (xining,qiqihaer)
计算haversine(nanchong经度,nanchong纬度,xining经度,xining纬度)和haversine(nanchong经度,nanchong纬度,qiqihaer经度,qiqihaer纬度)
比如离 xining近 最后就返回xining

不知道这么说 大家能理解我的意思吗。。。
先谢过




回复

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-12 09:54:16 | 显示全部楼层
本帖最后由 剑心无痕 于 2017-12-12 09:59 编辑

import pandas as pd

d=pd.read_table('1.txt',sep=' +')

def find(row, df):
    return df[(df['cluster'] == row['cluster']) & df['YN']].apply(lambda row, longitude, latitude:haversine(float(row['longitude']), float(row['latitude']), longitude, latitude), axis=1, longitude=float(row['longitude']), latitude=float(row['latitude'])).idxmin()

res = d.apply(find, axis=1, df=d)

res就是你要的结果吧
city
Beijing        Beijing
Shanghai      Shanghai
Guangzhou    Guangzhou
Shenzhen      Shenzhen
Chengdu        Chengdu
Maanshan        Xining
Nanchong        Xining
Xining          Xining
Xiaogan         Xining
Qiqihaer      Qiqihaer
dtype: object

回复 支持 反对

使用道具 举报

5

主题

14

帖子

14

积分

贫民

积分
14
sally786  楼主| 发表于 2017-12-12 10:34:43 | 显示全部楼层
剑心无痕 发表于 2017-12-12 09:54
import pandas as pd

d=pd.read_table('1.txt',sep=' +')

是的是的 我写的好复杂 而且算出来都是一个相似的城市
def get_closest_city(local_city):

    assert  (local_city in notinlist['city'].values), (local_city +" is not in the city list")
    city_position_data = notinlist[notinlist['city'] == local_city]

    cluster = city_position_data['cluster'].values[0]
    longitude_local = city_position_data['longitude'].values[0]
    latitude_local = city_position_data['latitude'].values[0]

    tagrt_inlist_data = inlist[inlist['cluster'] == cluster]

    target_city = local_city
    target_distance = 0
    for _, row in tagrt_inlist_data.iterrows():
        city_target = row['city']
        longitude_target = row['longitude']
        latitude_target = row['latitude']

        distance = haversine(longitude_local, latitude_local, longitude_target, latitude_target)
        if distance > target_distance :
            target_city = city_target
            target_distance = distance

    return target_city, target_distance
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表