Ok, we have done this.
I would advise you to use a microservice architecture: e.g. your code calls a Python Rest Service which computes the data and returns the result. Or if the operation is long (which clustering is most of the time) use a message queue as broker between the two services.
You can directly call python code from C# using the library http://pythonnet.github.io/.
When it works, it works amazingly well. If not, you are in a world of hurt - most especially it sometimes fails to load (deterministig at least, but fun to diagnose).
Furthermore, due to python GIL, you are restricted to one Python process.
Also, marshalling data between Python and C# is nontrivial and leads to interesting debugging sessions, e.g. trying to poke into the insides of an IENumerable in Python...
Overall, the microservice pattern is easier to build, to reason about,to debug and to build. Only drawback is that you have now 2 or 3 moving parts, which can be a deal breaker.