2012-09-10 15 views
20

¿Cómo pido columnas de acuerdo con los valores de la última fila? En el siguiente ejemplo, mi df final tendrá columnas en el siguiente orden: 'ddd' 'aaa' 'ppp' 'fff'.Python pandas ordenar columna según los valores en una fila

>>> df = DataFrame(np.random.randn(10, 4), columns=['ddd', 'fff', 'aaa', 'ppp']) 
>>> df 
     ddd  fff  aaa  ppp 
0 -0.177438 0.102561 -1.318710 1.321252 
1 0.980348 0.786721 0.374506 -1.411019 
2 0.405112 0.514216 1.761983 -0.529482 
3 1.659710 -1.017048 -0.737615 -0.388145 
4 -0.472223 1.407655 -0.129119 -0.912974 
5 1.221324 -0.656599 0.563152 -0.900710 
6 -1.816420 -2.898094 -0.232047 -0.648904 
7 2.793261 0.568760 -0.850100 0.654704 
8 -2.180891 2.054178 -1.050897 -1.461458 
9 -1.123756 1.245987 -0.239863 0.359759 

Respuesta

22

[actualizan para simplificar]

tl; dr:

In [29]: new_columns = df.columns[df.ix[df.last_valid_index()].argsort()] 

In [30]: df[new_columns] 
Out[30]: 
     aaa  ppp  fff  ddd 
0 0.328281 0.375458 1.188905 0.503059 
1 0.305457 0.186163 0.077681 -0.543215 
2 0.684265 0.681724 0.210636 -0.532685 
3 -1.134292 1.832272 0.067946 0.250131 
4 -0.834393 0.010211 0.649963 -0.551448 
5 -1.032405 -0.749949 0.442398 1.274599 

Algunos explicación sigue. En primer lugar, la construcción de la DataFrame:

In [24]: df = pd.DataFrame(np.random.randn(6, 4), columns=['ddd', 'fff', 'aaa', 'ppp']) 

In [25]: df 
Out[25]: 
     ddd  fff  aaa  ppp 
0 0.503059 1.188905 0.328281 0.375458 
1 -0.543215 0.077681 0.305457 0.186163 
2 -0.532685 0.210636 0.684265 0.681724 
3 0.250131 0.067946 -1.134292 1.832272 
4 -0.551448 0.649963 -0.834393 0.010211 
5 1.274599 0.442398 -1.032405 -0.749949 

Obtener la última fila:

In [26]: last_row = df.ix[df.last_valid_index()] 

Obtener los índices que lo solucionaría:

In [27]: last_row.argsort() 
Out[27]: 
ddd 2 
fff 3 
aaa 1 
ppp 0 
Name: 5, Dtype: int32 

Utilice esta indexar df:

In [28]: df[last_row.argsort()] 
Out[28]: 
     aaa  ppp  fff  ddd 
0 0.328281 0.375458 1.188905 0.503059 
1 0.305457 0.186163 0.077681 -0.543215 
2 0.684265 0.681724 0.210636 -0.532685 
3 -1.134292 1.832272 0.067946 0.250131 
4 -0.834393 0.010211 0.649963 -0.551448 
5 -1.032405 -0.749949 0.442398 1.274599 

¡Beneficio!

1

usaría transposición y el método de ordenación (que funciona en columnas):

df = pd.DataFrame(np.random.randn(10, 4), columns=['ddd', 'fff', 'aaa', 'ppp']) 
last_row_name = df.index[-1] 
sorted_df = df.T.sort(columns=last_row_name).T 

podría sufrir un impacto en el rendimiento, pero es rápido y fácil.

5

El método sort_values lo hace directamente cuando se le da el argumento axis=1.

sorted_df = df.sort_values(df.last_valid_index(), axis=1) 

Por lo tanto, ya no es necesario para transponer la trama de datos para ordenar por una fila. Además, el método sort ahora está en desuso.

-1
df=df[df.iloc[-1,:].sort_values().index] 

Esto funciona

+8

código sólo respuestas enviaban anima, ya que no proporcionan mucha información para los futuros lectores por favor provea una explicación a lo que ha escrito – WhatsThePoint

+0

@WhatsThePoint: 1 de mi lado. Husimu: Proporcione su respuesta con descripciones claras. No escriba el código, brinde la explicación sobre el código que ha compartido, para que otros también puedan entenderlo y sea útil. Le solicito que lea la sección de preguntas frecuentes para poder utilizar el desbordamiento de pila de manera efectiva. –

+1

Por favor explique por qué esto funciona. – Matt

Cuestiones relacionadas