【发布时间】:2016-01-28 09:57:02
【问题描述】:
我正在尝试使用 Pandas/Numpy/Scipy 等在 Python 中进行一些最近邻类型分析,并尝试了几种不同的方法,我很难过。
我有如下 2 个数据框:
df1
Lon1 Lat1 Type
10 10 A
50 50 A
20 20 B
df2
Lon2 Lat2 Type Data-1 Data-2
11 11 A Eggs Bacon
51 51 A Nuts Bread
61 61 A Beef Lamb
21 21 B Chips Chicken
31 31 B Sauce Pasta
71 71 B Rice Oats
81 81 B Beans Peas
我正在尝试识别 df2 中的 2 个最近邻(基于使用欧几里德距离的 Lon / Lat 值),然后将适当的 Data-1 和 Data-2 值合并到 df1 上,如下所示:
Lon1 Lat1 Type Data-1a Data-2a Data-1b Data-2b
10 10 A Eggs Bacon Nuts Bread
50 50 A Nuts Bread Beef Lamb
20 20 B Chips Chicken Sauce Pasta
我已经尝试过长格式和宽格式方法,并且倾向于使用 scipy 中的 ckd 树,但是有没有办法做到这一点,所以它只查看具有适当类型的行?
提前致谢。
** 编辑 **
我已经取得了一些进展:
Typelist = df2['Type'].unique().tolist()
df_dict = {'{}'.format(x): df2[(df2['Type'] == x)] for x in Rlist}
def treefunc(row):
if row['Type'] == 'A':
type = row['Type']
location = row[['Lon1','Lat1']].values
tree = cKDTree(df_dict[type][['Lon2','Lat2']].values)
dists, indexes = tree.query(location, k=2)
return dists,indexes
dftest = df1.apply(treefunc,axis=1)
这给了我两个最近邻居的距离和索引列表,这很棒!但是我仍然有一些问题:
我尝试使用 .isin 测试 row['Type'] 列的 Typelist 成员资格,但这不起作用 - 还有其他方法吗?
如何让 Pandas 为 kdtree 生成的 dist 和索引创建新列?
另外,如何使用索引返回 Data-1 和 Data-2?
提前致谢。
【问题讨论】:
-
如何在最后一个数据框中获得
Data-1b和Data-2b列? -
如果这是第二近邻,那么这些列对于第 1 行是错误的(应该分别是
Chips和Chicken)。 -
它们是第二近邻的 Data-1 和 Data-2 列
-
薯片和鸡肉属于“B”型,因此应忽略。我只想在第 1 行返回类型“A”的数据。
标签: python pandas numpy scipy nearest-neighbor