【问题标题】:Pandas - convert columns to grouped array coordinatesPandas - 将列转换为分组数组坐标
【发布时间】:2014-11-22 06:59:19
【问题描述】:

我有一个 (x, y) 坐标的 DataFrame,我想将其转换为数组以执行成对距离计算。

df = pd.DataFrame({'type':      ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c'],
...                      'x': [1, 3, 5, 1, 3, 1, 3, 5],
...                      'y':   [2, 4, 6, 2, 4, 2, 4, 6]})

所需的输出 - 数组中的分组/聚合坐标的新 DataFrame,以便我可以对每个数组应用函数:

grp =       coordinates
    a    array([[1, 2],
               [3, 4],
               [5, 6]])

    b    array([[1, 2],
               [3, 4]])

    c    array([[1, 2],
               [3, 4],
               [5, 6]])

我希望应用的距离计算...

grp['distances'] = grp.apply(lambda x: scipy.spatial.distance.pdist(x['coordinates'], 'euclidean'), axis = 1)

我似乎无法使用 groupby 函数来执行此操作。有什么想法吗?

【问题讨论】:

    标签: python arrays pandas scipy euclidean-distance


    【解决方案1】:

    用 x,y 对创建一个新列

    df['xy'] = df.apply(lambda x: [x['x'], x['y']], axis=1)
    

    groupby 并聚合成列表列表

    gb = df.groupby('type')
    df2 = gb.aggregate({'xy': lambda x: list(x)})
    

    这会产生:

    df2  
        xy
    type    
    a   [[1, 2], [3, 4], [5, 6]]
    b   [[1, 2], [3, 4]]
    c   [[1, 2], [3, 4], [5, 6]]
    

    请注意,要应用距离函数,您必须这样做:

    from scipy.spatial import distance
    df2['distances'] = df2['xy'].apply(lambda x: distance.pdist(x, 'euclidean'))
    
    df2
    
        xy                          distances
    type        
    a   [[1, 2], [3, 4], [5, 6]]    [2.82842712475, 5.65685424949, 2.82842712475]
    b   [[1, 2], [3, 4]]            [2.82842712475]
    c   [[1, 2], [3, 4], [5, 6]]    [2.82842712475, 5.65685424949, 2.82842712475]
    

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2016-09-26
      • 2020-10-20
      • 1970-01-01
      • 2021-05-27
      • 2015-12-04
      相关资源
      最近更新 更多