使用其他列计算 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)
我有一个包含 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)