jov*_*cbg 8 python nearest-neighbor pandas
我在获取pandas数据框中某些行的最近值并用这些行中的值填充另一列时遇到问题。
我有数据样本:
id su_id r_value match_v
A A1 0 1
A A2 0 1
A A3 70 2
A A4 120 100
A A5 250 3
A A6 250 100
B B1 0 1
B B2 30 2
Run Code Online (Sandbox Code Playgroud)
关键是,无论哪里match_v等于100,我都需要将其替换为最接近原始行(其中等于)100的行中的值,而只是将组(按id分组)r_valuer_valuematch_v100
预期产量
id su_id r_value match_v
A A1 0 1
A A2 0 1
A A3 70 2
A A4 120 2
A A5 250 3
A A6 250 3
B B1 0 1
B B2 30 2
Run Code Online (Sandbox Code Playgroud)
我尝试通过转移来创建线索和腿,然后发现差异。但是效果不佳,并且以某种方式弄乱了已经不错的价值。我没有尝试过其他任何事情,因为我真的不知道。
欢迎任何帮助或提示,如果您需要任何其他信息,我在这里。
提前致谢。
更像 merge_asof
s=df.loc[df.match_v!=100]
s=pd.merge_asof(df.sort_values('r_value'),s.sort_values('r_value'),on='r_value',by='id',direction='nearest')
df['match_v']=df['su_id'].map(s.set_index('su_id_x')['match_v_y'])
df
Out[231]:
id su_id r_value match_v
0 A A1 0 1
1 A A2 0 1
2 A A3 70 2
3 A A4 120 2
4 A A5 250 3
5 A A6 250 3
6 B B1 0 1
7 B B2 30 2
Run Code Online (Sandbox Code Playgroud)
这是使用numpy广播的另一种方法,可以加快计算速度
l=[]
for x , y in df.groupby('id'):
s1=y.r_value.values
s=abs((s1-s1[:,None])).astype(float)
s[np.tril_indices(s.shape[0], 0)] = 999999
s=s.argmin(0)
s2=y.match_v.values
l.append(s2[s][s2==100])
df.loc[df.match_v==100,'match_v']=np.concatenate(l)
df
Out[264]:
id su_id r_value match_v
0 A A1 0 1
1 A A2 0 1
2 A A3 70 2
3 A A4 120 2
4 A A5 250 3
5 A A6 250 3
6 B B1 0 1
7 B B2 30 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |