Python 使用pandas groupby创建包含父数据帧所有列的新数据帧
编辑:重写整个问题 我编写了一个程序,根据经度和纬度将一个商店位置列表与另一个医生位置列表进行匹配 每个商店位置都有一个唯一的ID。我想为每个唯一的ID单元找到3行,在本例中是最小的距离值。我希望这些行包含原始df中的所有信息 使用这句话,我可以找到单位数和它们对应的距离,但没有别的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
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