Pandas anidadas de género y NaN

Estoy tratando de entender el comportamiento esperado de DataFrame.sort en columnas con valores de NaN.

Teniendo en cuenta este DataFrame:

In [36]: df Out[36]: ab 0 1 9 1 2 NaN 2 NaN 5 3 1 2 4 6 5 5 8 4 6 4 5 

La clasificación utilizando una columna pone el NaN al final, como se esperaba:

 In [37]: df.sort(columns="a") Out[37]: ab 0 1 9 3 1 2 1 2 NaN 6 4 5 4 6 5 5 8 4 2 NaN 5 

Pero el tipo nested no se comporta como esperaría, dejando el NaN sin clasificar:

 In [38]: df.sort(columns=["a","b"]) Out[38]: ab 3 1 2 0 1 9 1 2 NaN 2 NaN 5 6 4 5 4 6 5 5 8 4 

¿Hay alguna forma de asegurarse de que los NaN en ordenación anidada aparezcan al final, por columna?

Hasta que se solucionó en Pandas, esto es lo que estoy usando para clasificar según mis necesidades, con un subconjunto de la funcionalidad de la función DataFrame.sort original. Esto funcionará solo para valores numéricos:

 def dataframe_sort(df, columns, ascending=True): a = np.array(df[columns]) # ascending/descending array - -1 if descending, 1 if ascending if isinstance(ascending, bool): ascending = len(columns) * [ascending] ascending = map(lambda x: x and 1 or -1, ascending) ind = np.lexsort([ascending[i] * a[:, i] for i in reversed(range(len(columns)))]) return df.iloc[[ind]] 

Ejemplo de uso:

 In [4]: df Out[4]: abc 10 1 9 7 11 NaN NaN 1 12 2 NaN 6 13 NaN 5 6 14 1 2 6 15 6 5 NaN 16 8 4 4 17 4 5 3 In [5]: dataframe_sort(df, ['a', 'c'], False) Out[5]: abc 16 8 4 4 15 6 5 NaN 17 4 5 3 12 2 NaN 6 10 1 9 7 14 1 2 6 13 NaN 5 6 11 NaN NaN 1 In [6]: dataframe_sort(df, ['b', 'a'], [False, True]) Out[6]: abc 10 1 9 7 17 4 5 3 15 6 5 NaN 13 NaN 5 6 16 8 4 4 14 1 2 6 12 2 NaN 6 11 NaN NaN 1