按列中的值从数据框中提取矩阵

Extract matrix from a dataframe by value from columns

我正在尝试一些可能有点难以理解的东西,但我会尝试非常具体。

我有一个这样的 python 数据框

Locality Count Lat. Long.
Krasnodar Russia 44 39
Tirana Albania 41.33 19.83
Areni Armenia 39.73 45.2
Kars Armenia 40.604517 43.100758
Brunn Wolfholz Austria 48.120396 16.291722
Kleinhadersdorf Flur Marchleiten Austria 48.663197 16.589687
Jalilabad district Azerbaijan 39.3607139 48.4613556
Zeyem Chaj Azerbaijan 40.9418889 45.8327778
Jalilabad district Azerbaijan 39.5186111 48.65

还有一个带有一些国家名称的数据框cities.txt

Albania 
Armenia
Austria
Azerbaijan

等等。 接下来我要做的是转换这个纬度。和龙。值作为弧度,然后使用列表中的值执行以下操作:

with open('cities.txt') as file:
  lines=file.readlines()
  x=np.where(df['Count'].eq(lines),pd.DataFrame(
  dist.pairwise(df[['Lat.','Long.']].to_numpy())*6373,
    columns=df.Locality.unique(), index=df.Locality.unique()))

其中 pd.DataFrame(dist.pairwise(df[['Lat.','Long.']].to_numpy())*6373, columns=df.Locality.unique(), index=df.Locality.unique())Lat. Long. 中的弧度转换为以公里为单位的距离,并为每条线(国家/地区)创建一个数据框作为矩阵。

最后我会有很多矩阵 2d(理论上)按国家分组,我想应用这个:

>>>Russia.min()
0
>>>Russia.max()
5

获取每个矩阵中的 .min().max() 值并将此结果保存在 cities.txt 中作为

Country Max.Dist. Min. Dist.
Albania  5    1
Armenia  10   9
Austria  5    3
Azerbaijan 0  0

不幸的是,1) 我在第一部分有警告 ValueError: Lengths must be equal,2) 可以将这个矩阵按国家/地区分组,并且 3) 保存我的 .min().max() 个值?

我不确定您到底想要什么作为最低要求。在此解决方案中,如果只有 1 个城市,则最小值为 0,否则为国内 2 个城市之间的最短距离。此外,文件名 cities.txt 似乎只是一个过滤器。我没有这样做,但看起来很简单。

import numpy as np
import pandas as pd

这里只是一些示例数据;

cities = pd.read_json("https://raw.githubusercontent.com/lutangar/cities.json/master/cities.json")
cities = cities.sample(10000)

groupby()

创建并应用自定义聚合
from sklearn.metrics import DistanceMetric
dist = DistanceMetric.get_metric('haversine')

country_groups = cities.groupby("country")

def city_distances(group):
    geo = group[['lat','lng']]

    EARTH_RADIUS = 6371

    haversine_distances = dist.pairwise(np.radians(geo) )
    haversine_distances *= EARTH_RADIUS
    
    distances = {}
    distances['max'] = np.max(haversine_distances)
    
    distances['min'] = 0
    if len(haversine_distances[ np.nonzero(haversine_distances)] ) > 0 :
        distances['min'] = np.min( haversine_distances[ np.nonzero(haversine_distances)] )
        
    return pd.Series(distances)

country_groups.apply(city_distances)

在我的例子中,它打印出类似

的内容
                 max         min
country                         
AE        323.288482  323.288482
AF       1130.966661   15.435642
AI         12.056890   12.056890
AL        272.300688    3.437074
AM        268.051071    1.328605
...              ...         ...
YE        662.412344   19.103222
YT          3.723376    3.723376
ZA       1466.334609   24.319334
ZM       1227.429001  218.566369
ZW        503.562608   26.316902

[194 rows x 2 columns]