So you want continuous lines in your density plot, but you have very sparse data. So here's an upsampling-based method.
First some trivial upsampling based on neighbor-distance:
subdata = Pick[data, GreaterThan[.1] /@ Rescale@data[[All, 3]]];
upsampled =
DeleteDuplicates[#, Norm[#[[;; 2]] - #2[[;; 2]]] < .1 &] &@
Join[
Flatten[
Table[
If[1 < Norm[subdata[[i, ;; 2]] - subdata[[j, ;; 2]]] < 1.5,
Mean@subdata[[{i, j}]],
Nothing
],
{i, Length@subdata},
{j, Length@subdata}
],
1
],
subdata
];
upsampled[[All, ;; 2]] // Point // Graphics

Then make a background grid where the true interpolation will live:
gridspacings =
MapThread[
Append[
MinMax[#],
Min@{
Min@
Select[GreaterThan[10^-3]]@
Differences@Sort[#2],
.1
}
] &, {
Transpose@data[[All, ;; 2]],
Transpose@upsampled[[All, ;; 2]]
}];
background =
Flatten[
Table[{x, y},
Evaluate@{x, Sequence @@ gridspacings[[1]]},
Evaluate@{y, Sequence @@ gridspacings[[2]]}
],
1
];
Next let grid points have the value of the nearest point in the original sample and use a 1/r^n
-type decay to assign the real value at a grid point:
nf = Nearest[Thread[upsampled[[All, ;; 2]] -> upsampled]];
bgn = nf[background, 1][[All, 1]];
mtBg =
Compile[
{{bg, _Real, 2}, {nb, _Real,
2}, {maxnorm, _Real}, {minRad, _Real}, {scl, _Real}, {pow, \
_Real}},
MapThread[
Append[#,
If[Norm[# - #2[[;; 2]]] < maxnorm,
#2[[3]]/(scl*Max@{Norm[# - #2[[;; 2]]], minRad})^pow,
0.
]
] &,
{
bg,
nb
}
]
];
updata = mtBg[background, bgn, 100, .5, 1., 2];
This can be trivially interpolated and DensityPlot
-ted:
itf = Interpolation[updata];
DensityPlot[itf[x, y], {x, 1, 41}, {y, -5, 19.5}]

You can kinda tune the look of that by the parameters in mtBg
.
Here's another version:
itf2 = Interpolation[mtBg[background, bgn, .8, .1, .1, 1]];
DensityPlot[itf2[x, y], {x, 1, 41}, {y, -5, 19.5}, PlotRange -> All ]

Original
It seems to be a bit better if you do some clipping first:
data = Import["https://pastebin.com/raw/TZwajVgT", "TSV"];
Pick[data, GreaterThan[0] /@ Rescale@data[[All, 3]]] //
ListDensityPlot[#,
Background -> ColorData["DarkRainbow"][0],
ColorFunction -> ColorData["DarkRainbow"]
] &

Alternatively you can build it from the ground up:
With[{cd = ColorData["DarkRainbow"]},
Graphics[
{
PointSize[Large],
Point[data[[All, ;; 2]],
VertexColors ->
Map[Directive[Opacity[#], cd[1 - #]] &, Rescale@data[[All, 3]]]
]
},
Background -> cd[0]
]
]

Note that that's pretty much the same as this:
With[{cd = ColorData["DarkRainbow"]},
ListPointPlot3D[data,
ColorFunction -> Function@Directive[Opacity[#3], cd[1 - #3]],
Background -> cd[0],
ViewPoint -> Above,
Boxed -> False
]
]
