【发布时间】:2020-04-04 08:05:39
【问题描述】:
我有一个这样的数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame.from_dict({'group': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'obj': [1, 2, 3, 1, 2, 3, 1, 2, 3],
'x0': np.repeat(np.random.rand(3), 3),
'y0': np.repeat(np.random.rand(3), 3),
'x': np.random.rand(9),
'y': np.random.rand(9)})
group obj x0 y0 x y
0 1 1 0.577952 0.936173 0.681409 0.905242
1 1 2 0.577952 0.936173 0.995970 0.284488
2 1 3 0.577952 0.936173 0.436973 0.163712
3 2 1 0.802995 0.264205 0.586934 0.292848
4 2 2 0.802995 0.264205 0.204437 0.022746
5 2 3 0.802995 0.264205 0.626687 0.000793
6 3 1 0.343862 0.847310 0.966428 0.496161
7 3 2 0.343862 0.847310 0.465727 0.512349
8 3 3 0.343862 0.847310 0.069815 0.689743
我想将此 DataFrame 聚合为如下所示的:
group x0 y0 closest
0 1 0.577952 0.936173 3
1 2 0.802995 0.264205 1
2 3 0.343862 0.847310 1
其中closest 是obj 的值,它在每个group 中最接近(x0, y0)。但是,我无法使用aggregate 函数来计算使用列的距离。我得到的最远的是:
df.groupby('group').apply(lambda x: np.sqrt((x['x0'] - x['x']) ** 2 + (x['y0'] - x['y']) ** 2).argmin())
我计算最接近obj 的索引,但我不知道如何返回obj 的值。我试过lambda x: x.iloc[ np.sqrt((x['x0'] - x['x']) ** 2 + (x['y0'] - x['y']) ** 2).argmin(), 'obj'],但它会导致错误。因此我的问题是:
- 如何返回值
obj而不是索引? - 我从 groupby + apply 获得的对象是什么?它似乎不是 DataFrame,因为我不能在上面使用
.iloc
【问题讨论】:
标签: python pandas group-by aggregate