2017-04-21 58 views
2

编辑的所有列的新数据框中:重写了全部询问使用熊猫GROUPBY创建包含父数据帧

我已经写了那的位置的列表相匹配,而基于医生位置的其他程序列表经度和纬度

每一个存储单元拥有一个唯一的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 

预期的输出将减少数据帧至由单元

+0

您能否提供样本输入? –

+0

显示原始DF请 –

+0

@ juanpa.arrivillaga梅德-polonskiy在原来的列标题添加。 –

回答

1

使用set_index分组三个最接近 doctor_names( )首先

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 
+1

即完美 – piRSquared

3

pandas

模糊和可爱,也相当快

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 

numpy

快速

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 

定时小数据

enter image description here

定时大型数据

enter image description here

+0

啊!伎俩没有2 :) – Vaishali

+1

@ A-ZA-Z我正在做一个完整的排序,这是没有必要的。一些'最小'的方法应该更好。这看起来很酷。我正在整理一个更快的,并会显示时间。这绝对是可以理解的。 – piRSquared

+0

@piRSquared好奇看到优化版本,以及! –