Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要使用两列纬度和经度合并两个熊猫数据帧_Python_Pandas_Merge_Latitude Longitude - Fatal编程技术网

Python 需要使用两列纬度和经度合并两个熊猫数据帧

Python 需要使用两列纬度和经度合并两个熊猫数据帧,python,pandas,merge,latitude-longitude,Python,Pandas,Merge,Latitude Longitude,这是我的数据框#1:城市名称及其纬度和经度 df1 = {"city":['delhi','new york','london','paris','chennai'],"lat":[12.23,22.444,23.233,45.32,34.22],"long":[11.22,22.332,34.23,55.23,24.22] df2 = pd.DataFrame({"country":['India','US','UK','France','India'],"lat":[12.13,22.54

这是我的数据框#1:城市名称及其纬度和经度

df1 = {"city":['delhi','new york','london','paris','chennai'],"lat":[12.23,22.444,23.233,45.32,34.22],"long":[11.22,22.332,34.23,55.23,24.22]
df2 = pd.DataFrame({"country":['India','US','UK','France','India'],"lat":[12.13,22.54,22.33,45.32,34.22],"long":[11.12,22.132,34.23,54.23,24.22]})
这是数据帧#2:带纬度和经度的国家名称

df1 = {"city":['delhi','new york','london','paris','chennai'],"lat":[12.23,22.444,23.233,45.32,34.22],"long":[11.22,22.332,34.23,55.23,24.22]
df2 = pd.DataFrame({"country":['India','US','UK','France','India'],"lat":[12.13,22.54,22.33,45.32,34.22],"long":[11.12,22.132,34.23,54.23,24.22]})
我需要匹配这两列lat和long来合并这两个表。问题是lat和long不完全匹配,值为+或-0.1或0.2。(如果匹配,我可以使用pd.merge选项) 横向和纵向在这里是不真实的。只是一个例子

预期结果:

result = pd.DataFrame({"city":['delhi','new york','london','paris','chennai'],"country":['India','US','UK','France','India'],"lat":[12.13,22.54,22.33,45.32,34.22],"long":[11.12,22.132,34.23,54.23,24.22]})

合并这些表的最佳方法是什么?

例如交叉合并:

(df1.assign(dummy=1)
    .merge(df2.assign(dummy=1),on='dummy')
    .query('abs(lat_x-lat_y)<=0.1 and abs(long_x-long_y)<=0.2')
    .drop('dummy', axis=1)
)

例如,交叉合并:

(df1.assign(dummy=1)
    .merge(df2.assign(dummy=1),on='dummy')
    .query('abs(lat_x-lat_y)<=0.1 and abs(long_x-long_y)<=0.2')
    .drop('dummy', axis=1)
)
这里可能有用

如果国家边界为多边形,则可以使用

在你的问题中,你将国家减少到单一点,这可能不是最好的代表

文档中的示例:

在空间连接中,两个几何体对象将根据它们之间的空间关系合并

# One GeoDataFrame of countries, one of Cities.
# Want to merge so we can get each city's country.
In [11]: countries.head()
Out[11]: 


                                           geometry                   country
0  MULTIPOLYGON (((180.000000000 -16.067132664, 1...                      Fiji
1  POLYGON ((33.903711197 -0.950000000, 34.072620...                  Tanzania
2  POLYGON ((-8.665589565 27.656425890, -8.665124...                 W. Sahara
3  MULTIPOLYGON (((-122.840000000 49.000000000, -...                    Canada
4  MULTIPOLYGON (((-122.840000000 49.000000000, -...  United States of America

In [12]: cities.head()
Out[12]: 
           name                           geometry
0  Vatican City  POINT (12.453386545 41.903282180)
1    San Marino  POINT (12.441770158 43.936095835)
2         Vaduz   POINT (9.516669473 47.133723774)
3    Luxembourg   POINT (6.130002806 49.611660379)
4       Palikir  POINT (158.149974324 6.916643696)

# Execute spatial join
In [13]: cities_with_country = geopandas.sjoin(cities, countries, how="inner", op='intersects')

In [14]: cities_with_country.head()
Out[14]: 
             name                           geometry  index_right  country
0    Vatican City  POINT (12.453386545 41.903282180)          141    Italy
1      San Marino  POINT (12.441770158 43.936095835)          141    Italy
192          Rome  POINT (12.481312563 41.897901485)          141    Italy
2           Vaduz   POINT (9.516669473 47.133723774)          114  Austria
184        Vienna  POINT (16.364693097 48.201961137)          114  Austria
如果没有表示国家的多边形,则需要将表示每个国家的点延伸到一个区域。可以使用以下方法执行此操作:将点延伸到给定距离的区域:

Point(0, 0).buffer(10.0),
这里可以使用坐标
[0,0]
处的点和距离
10.0

如果国家边界为多边形,则可以使用

在你的问题中,你将国家减少到单一点,这可能不是最好的代表

文档中的示例:

在空间连接中,两个几何体对象将根据它们之间的空间关系合并

# One GeoDataFrame of countries, one of Cities.
# Want to merge so we can get each city's country.
In [11]: countries.head()
Out[11]: 


                                           geometry                   country
0  MULTIPOLYGON (((180.000000000 -16.067132664, 1...                      Fiji
1  POLYGON ((33.903711197 -0.950000000, 34.072620...                  Tanzania
2  POLYGON ((-8.665589565 27.656425890, -8.665124...                 W. Sahara
3  MULTIPOLYGON (((-122.840000000 49.000000000, -...                    Canada
4  MULTIPOLYGON (((-122.840000000 49.000000000, -...  United States of America

In [12]: cities.head()
Out[12]: 
           name                           geometry
0  Vatican City  POINT (12.453386545 41.903282180)
1    San Marino  POINT (12.441770158 43.936095835)
2         Vaduz   POINT (9.516669473 47.133723774)
3    Luxembourg   POINT (6.130002806 49.611660379)
4       Palikir  POINT (158.149974324 6.916643696)

# Execute spatial join
In [13]: cities_with_country = geopandas.sjoin(cities, countries, how="inner", op='intersects')

In [14]: cities_with_country.head()
Out[14]: 
             name                           geometry  index_right  country
0    Vatican City  POINT (12.453386545 41.903282180)          141    Italy
1      San Marino  POINT (12.441770158 43.936095835)          141    Italy
192          Rome  POINT (12.481312563 41.897901485)          141    Italy
2           Vaduz   POINT (9.516669473 47.133723774)          114  Austria
184        Vienna  POINT (16.364693097 48.201961137)          114  Austria
如果没有表示国家的多边形,则需要将表示每个国家的点延伸到一个区域。可以使用以下方法执行此操作:将点延伸到给定距离的区域:

Point(0, 0).buffer(10.0),

假设一个点位于坐标
[0,0]
处,距离
10.0

是否足以使用值的整数部分?否。。。如果我们只匹配了整数部分,我们就错过了真实数据中城市和国家的正确匹配。如果您的数据不是太大,请交叉合并和查询。@Quanghaang:您能举个例子吗?使用值的整数部分就足够了吗?不。。。如果我们只匹配了整数部分,我们就错过了真实数据中城市和国家的正确匹配。如果你的数据不是太大,交叉合并和查询。@Quanghaang:你能举个例子吗?效果很好。通过将限制调整为0.25,我可以得到很好的结果。谢谢工作很好。通过将限制调整为0.25,我可以得到很好的结果。谢谢。它适用于几何图形。例如,点是否包含在多边形中。在给定示例中,一个几何体是多边形,另一个几何体是点。。就我而言,这两点都是重点。它会影响流程吗?您可以通过使用
缓冲区
方法将点扩展到区域来实现这一点。我编辑了答案。没有。它适用于几何图形。例如,点是否包含在多边形中。在给定示例中,一个几何体是多边形,另一个几何体是点。。就我而言,这两点都是重点。它会影响流程吗?您可以通过使用
缓冲区
方法将点扩展到区域来实现这一点。我编辑了答案。