如何解决用零填充缺失值以获取不均匀点的列表
我有一组点另存为数据框 dp :
{
$group: {
_id: {
$datetoString: {
format: "%d/%m/%Y",date: "$timestamp"
}
},start: {
$sum: {
$cond: [{
$eq: ['$eventName','connect']
},1,0]
}
},end: {
$sum: {
$cond: [{
$ne: ['$eventName',0]
}
}
}
}
使用pyplot.vlines,它们看起来像这样:
xlist ylist
0 0.017108 0.902494
1 0.019659 0.741981
2 0.030310 0.920884
3 0.032064 0.255826
4 0.046168 0.562761
5 0.060758 0.583044
6 0.118274 1.000000
7 0.125385 1.000000
8 0.140418 1.000000
9 0.153699 1.000000
10 0.186998 0.293743
11 0.215375 0.112288
12 0.217875 0.260883
13 0.250591 0.325953
14 0.262788 0.084916
15 0.287382 0.104910
16 0.325902 0.088418
17 0.377885 0.312025
18 0.473086 0.068632
19 0.485449 0.059624
20 0.557334 0.734376
21 0.572133 0.709392
22 0.610553 0.840687
23 0.626902 0.737930
24 0.630276 0.084787
25 0.637779 0.091535
26 0.717553 0.074411
27 0.742187 0.092770
28 0.757873 0.532881
29 0.780933 0.528202
30 0.836708 0.422615
31 0.920814 0.359896
32 0.938639 0.355241
33 0.954564 0.280989
34 0.978567 0.649749
35 0.995067 0.769272
我想将 xlist 替换为:
[plt.vlines(x,y) for x,y in zip(dp.xlist,dp.ylist)]
plt.show()
并使用ylist中的值创建新的 y ,其中 x 与xlist接近,在其他位置为零。
到目前为止,我尝试的是针对每对 xlist,ylist 值,我检查线性空间中是否有一个点足够接近xlist中的点,然后为其分配相应的ylist值,否则,我输入零。
x = linspace(0,num=100) ###(or num=200... not important)
但是我想我覆盖了列表“ fill”,这就是为什么它不起作用的原因,但是我不知道如何解决。
解决方法
无需循环。您可以使用熊猫方法:
dp['x_lin'] = x[np.abs(np.subtract.outer(x,dp.xlist.values)).argmin(0)]
dp['y_lin'] = 0
dp.y_lin[np.abs(dp.x_lin-dp.xlist)<0.001] = dp.ylist
您还可以将第一行替换为等同的内容:
dp['x_lin'] = x[np.abs(x[None,:]-dp.xlist[:,None]).argmin(1)]
输出:
xlist ylist x_lin y_lin
0 0.017108 0.902494 0.020202 0.000000
1 0.019659 0.741981 0.020202 0.741981
2 0.030310 0.920884 0.030303 0.920884
3 0.032064 0.255826 0.030303 0.000000
4 0.046168 0.562761 0.050505 0.000000
5 0.060758 0.583044 0.060606 0.583044
6 0.118274 1.000000 0.121212 0.000000
7 0.125385 1.000000 0.121212 0.000000
8 0.140418 1.000000 0.141414 1.000000
9 0.153699 1.000000 0.151515 0.000000
10 0.186998 0.293743 0.191919 0.000000
11 0.215375 0.112288 0.212121 0.000000
12 0.217875 0.260883 0.222222 0.000000
13 0.250591 0.325953 0.252525 0.000000
14 0.262788 0.084916 0.262626 0.084916
15 0.287382 0.104910 0.282828 0.000000
16 0.325902 0.088418 0.323232 0.000000
17 0.377885 0.312025 0.373737 0.000000
18 0.473086 0.068632 0.474747 0.000000
19 0.485449 0.059624 0.484848 0.059624
20 0.557334 0.734376 0.555556 0.000000
21 0.572133 0.709392 0.575758 0.000000
22 0.610553 0.840687 0.606061 0.000000
23 0.626902 0.737930 0.626263 0.737930
24 0.630276 0.084787 0.626263 0.000000
25 0.637779 0.091535 0.636364 0.000000
26 0.717553 0.074411 0.717172 0.074411
27 0.742187 0.092770 0.737374 0.000000
28 0.757873 0.532881 0.757576 0.532881
29 0.780933 0.528202 0.777778 0.000000
30 0.836708 0.422615 0.838384 0.000000
31 0.920814 0.359896 0.919192 0.000000
32 0.938639 0.355241 0.939394 0.355241
33 0.954564 0.280989 0.959596 0.000000
34 0.978567 0.649749 0.979798 0.000000
35 0.995067 0.769272 1.000000 0.000000
输出图:
,这看起来不错。
是的,您正在覆盖每个i
的填充。但是,您还要为每个xa添加tmp。我不太清楚你的x是什么。但是尝试:
fill = []
for i in dp.index:
tmp = 0
for xa in x:
if abs(dp.xlist[i]-xa)<0.001:
tmp = dp.ylist[i]
fill.append(tmp)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。