Sparse 3D binning/histogram function
Some suggestions:


Passing the code through at least one linter such as flake8 or pycodestyle will make for more idiomatic and therefore readable code.
Do you have any automated tests? If so, do they test all four combinations of weights and bin_index?
Do you really need weights and bin_index to be defaulted? I'm generally suspicious of code which defaults parameter values without a very clear reason.
Functions are first class citizens in Python, so rather than your nested if statements you can decide which method to call and what the second parameter should be with two unnested if statements:

if bin_index:
    binning_function = _bincenter
else:
    …

if weights:
    …

Naming is very important. I can't easily follow your code because things are named for what they are and not for what they contain or what they are used for. For example, pointdict tells me nothing about its contents and res could be short for “result”, “response” or something else entirely.
Reusing variables is generally discouraged - they make the information flow confusing, and they should be optimized away by the interpreter.
I don't remember the precedence rules other than for simple arithmetic by heart, so I'd enforce it using parentheses in expressions like x//res+0.5.


Rather than using a defaultdict(list) you can just pointdict.get(key, []) if you know the dict is sparse. This is purposely not a suggestion because whether it's appropriate or not depends on the programming environment, but it is an option.