Python 使用pandas groupby创建包含父数据帧所有列的新数据帧

Python 使用pandas groupby创建包含父数据帧所有列的新数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,编辑:重写整个问题 我编写了一个程序,根据经度和纬度将一个商店位置列表与另一个医生位置列表进行匹配 每个商店位置都有一个唯一的ID。我想为每个唯一的ID单元找到3行,在本例中是最小的距离值。我希望这些行包含原始df中的所有信息 使用这句话,我可以找到单位数和它们对应的距离,但没有别的 df.groupby(['unit'])['distance'].nsmallest(3) 原始数据帧示例 unit store_name distance doctor_name 1

编辑:重写整个问题

我编写了一个程序,根据经度和纬度将一个商店位置列表与另一个医生位置列表进行匹配

每个商店位置都有一个唯一的ID。我想为每个唯一的ID单元找到3行,在本例中是最小的距离值。我希望这些行包含原始df中的所有信息

使用这句话,我可以找到单位数和它们对应的距离,但没有别的

df.groupby(['unit'])['distance'].nsmallest(3)
原始数据帧示例

unit      store_name      distance     doctor_name
123       taqueria         0.3          dr. a
123       taqueria         0.35         dr. b
123       taqueria         0.2          dr. c
123       taqueria       0.5          dr. smith
123       taqueria       0.4          dr. q
123       taqueria       0.1          dr. who
456       carniceria         0.5          dr. a
456       carniceria         0.6         dr. b
456       carniceria         0.3          dr. c
456       carniceria       0.1         dr. smith
456       carniceria       0.2          dr. q
456       carniceria       0.05          dr. who
预期产量

unit      store_name      distance     doctor_name
123       taqueria         0.3          dr. a
123       taqueria         0.2          dr. c
123       taqueria       0.1          dr. who
456       carniceria       0.1         dr. smith
456       carniceria       0.2          dr. q
456       carniceria       0.05          dr. who
预期输出会将数据帧减少到按单位分组的三个最接近的医生名称

首先使用集合索引

df = df.set_index(['store_name', 'doctor_name'])    
df1 = df.groupby(['unit'])['distance'].nsmallest(3).reset_index()
你得到

    unit    store_name  doctor_name distance
0   123     taqueria    dr.who      0.10
1   123     taqueria    dr.c        0.20
2   123     taqueria    dr.a        0.30
3   456     carniceria  dr.who      0.05
4   456     carniceria  dr.smith    0.10
5   456     carniceria  dr.q        0.20
熊猫 毛茸茸的,可爱的,也挺快的

努比 快的

定时小数据

定时大数据


你能提供样本输入吗?显示原始dfplease@juanpa.arrivillagadmitry polonskiy在原始列标题中添加了。不,我不需要列名,您需要提供一个示例。就熊猫问题而言,这涉及到一个示例输入数据框,其中包含您期望的输出。@TrevorBurke您可以使用df.headn=10.to_dict提供一个示例输入,用于帮助您解决问题。这太完美了!技巧二:@A-Za-z我正在做一个不必要的完整排序。使用nsmallest的一些方法应该更好。这看起来很酷。我正在做一个更快的,并将显示时间。这当然是可以理解的。@Pirsquare也很想看看优化版!优化的第一次尝试没有这样快。这相当快。深入研究这个问题。“完全裸体,我们看看会发生什么。”特雷沃伯克做得更快了。但没有那么漂亮。
df.sort_values(['unit', 'distance']).groupby('unit').head(3)

    unit  store_name  distance doctor_name
5    123    taqueria      0.10     dr. who
2    123    taqueria      0.20       dr. c
0    123    taqueria      0.30       dr. a
11   456  carniceria      0.05     dr. who
9    456  carniceria      0.10   dr. smith
10   456  carniceria      0.20       dr. q
v = df.values
u = df.unit.values
d = df.distance.values
s = d.size
r = np.arange(s)
a = np.lexsort([d, u])
u2 = u[a]

b = (np.where(np.append(True, u2[1:] != u2[:-1]))[0])
delta = np.diff(np.append(b, s))
mask = ((r - b.repeat(delta)) < 3)
pd.DataFrame(v[a][mask], df.index[a][mask], df.columns)

   unit  store_name distance doctor_name
5   123    taqueria      0.1     dr. who
2   123    taqueria      0.2       dr. c
0   123    taqueria      0.3       dr. a
11  456  carniceria     0.05     dr. who
9   456  carniceria      0.1   dr. smith
10  456  carniceria      0.2       dr. q