按列中的值从数据框中提取矩阵
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]
我正在尝试一些可能有点难以理解的东西,但我会尝试非常具体。
我有一个这样的 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]