使用其他列计算 pandas 中列的值

Computing values for a column in pandas using other columns

我有一个包含 3 列的数据框:'longitude'、'latitude' 和 'country'。对于某些经度和纬度,国家列中的值为 'unknown'。这是数据框的概述:

  longitude   latitude  country
-76.250000  83.083333  China
-76.166667  83.083333  unknown
-76.083333  83.083333  USA
-76.000000  83.083333  India
-75.916667  83.083333  unknown
-68.166667 -55.500000   unknown
-67.666667 -55.500000   UK
-68.166667 -55.583333   Chile
-68.083333 -55.583333   Canada
-67.500000 -55.666667   unknown

对于未知国家,我想计算包含一个国家的经度和纬度的最小欧氏距离 name 并将 'unknown' 替换为该国家名称(最小距离)。有什么有效的方法吗?

你的例子不具有代表性。您拥有的唯一国家/地区值是智利。但是,像下面这样的东西应该可以工作:

from scipy.spatial import distance

def euclidean(point, others):
    return others[distance.cdist(point[None,:-1].astype(float), others[:,:-1].astype(float)).argmin(),2]

unknown = df[df["country"].eq("unknown")]
known = df[df["country"].ne("unknown")]

matches = unknown.apply(lambda row: scipy_euclidean(row.to_numpy(), known.to_numpy()), axis=1)
df["country"] = df["country"].where(df["country"].ne("unknown"), matches)

>>> df
   longitude   latitude country
0 -76.250000  83.083333   China
1 -76.166667  83.083333   China
2 -76.083333  83.083333     USA
3 -76.000000  83.083333   India
4 -75.916667  83.083333   India
5 -68.166667 -55.500000   Chile
6 -67.666667 -55.500000      UK
7 -68.166667 -55.583333   Chile
8 -68.083333 -55.583333  Canada
9 -67.500000 -55.666667      UK
性能:
big_df = pd.concat([df]*1000)
unknown = big_df[big_df["country"].eq("unknown")]
known = big_df[big_df["country"].ne("unknown")]

>>> %timeit unknown.apply(lambda row: euclidean(row.to_numpy(), known.to_numpy()), axis=1)
847 µs ± 26.6 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)