seleccionar nueva manejo insertar filtrar datos data crear columnas columna agregar python sorting dataframe pandas

python - nueva - ¿Cómo ordenar el marco de datos de pandas usando valores de varias columnas?



nueva columna pandas (7)

Tengo el siguiente marco de datos:

df = pandas.DataFrame([{''c1'':3,''c2'':10},{''c1'':2, ''c2'':30},{''c1'':1,''c2'':20},{''c1'':2,''c2'':15},{''c1'':2,''c2'':100}])

O, en forma legible para los humanos:

c1 c2 0 3 10 1 2 30 2 1 20 3 2 15 4 2 100

El siguiente comando de clasificación funciona como se esperaba:

df.sort([''c1'',''c2''], ascending=False)

Salida:

c1 c2 0 3 10 4 2 100 1 2 30 3 2 15 2 1 20

Pero el siguiente comando:

df.sort([''c1'',''c2''], ascending=[False,True])

resultados en

c1 c2 2 1 20 3 2 15 1 2 30 4 2 100 0 3 10

y esto no es lo que espero. Espero tener los valores en la primera columna ordenados de mayor a menor, y si hay valores idénticos en la primera columna, ordene por los valores ascendentes de la segunda columna.

¿Alguien sabe por qué no funciona como se esperaba?

ADICIONAL

Esto es copiar y pegar:

>>> df.sort([''c1'',''c2''], ascending=[False,True]) c1 c2 2 1 20 3 2 15 1 2 30 4 2 100 0 3 10


El método dataframe.sort () es, según entiendo, desaprobado en pandas> 0.18. Para resolver su problema, debe usar dataframe.sort_values ​​() en su lugar:

f.sort_values(by=["c1","c2"], ascending=[False, True])

La salida se ve así:

c1 c2 3 10 2 15 2 30 2 100 1 20


El uso del sort puede dar como resultado un mensaje de advertencia. Ver la discusión de github . Entonces, quizás quieras usar sort_values , docs here

Entonces tu código puede verse así:

df = df.sort_values(by=[''c1'',''c2''], ascending=[False,True])


En mi caso, la respuesta aceptada no funcionó:

f.sort_values ​​(por = ["c1", "c2"], ascendente = [Falso, Verdadero])

Solo lo siguiente funcionó como se esperaba:

f = f.sort_values(by=["c1","c2"], ascending=[False, True])


He encontrado que esto es realmente útil:

df = pd.DataFrame({''A'' : range(0,10) * 2, ''B'' : np.random.randint(20,30,20)}) # A ascending, B descending df.sort(**skw(columns=[''A'',''-B''])) # A descending, B ascending df.sort(**skw(columns=[''-A'',''+B'']))

Tenga en cuenta que, a diferencia de las columns=,ascending= estándar columns=,ascending= argumentos, aquí los nombres de las columnas y su orden de clasificación se encuentran en el mismo lugar. Como resultado, su código es mucho más fácil de leer y mantener.

Tenga en cuenta que la llamada real a .sort ha cambiado, skw ( s skw kw args) es solo una pequeña función de ayuda que analiza las columnas y devuelve los parámetros habituales de columns= y ascending= para usted. Pásalo de cualquier otro tipo kwargs como lo harías normalmente. Copie / pegue el siguiente código en, por ejemplo, su utils.py local, utils.py y simplemente utils.py se utils.py arriba.

# utils.py (or anywhere else convenient to import) def skw(columns=None, **kwargs): """ get sort kwargs by parsing sort order given in column name """ # set default order as ascending (+) sort_cols = [''+'' + col if col[0] != ''-'' else col for col in columns] # get sort kwargs columns, ascending = zip(*[(col.replace(''+'', '''').replace(''-'', ''''), False if col[0] == ''-'' else True) for col in sort_cols]) kwargs.update(dict(columns=list(columns), ascending=ascending)) return kwargs


Nota: Todo aquí es correcto, simplemente reemplace sort -> sort_values () Entonces, se convierte en:

import pandas as pd df = pd.read_csv(''data.csv'') df.sort_values(ascending=False,inplace=True)

Consulte el sitio web oficial DataFrame.sort_values .


Si está escribiendo este código como un archivo de script, tendrá que escribirlo así:

df = df.sort([''c1'',''c2''], ascending=[False,True])


ACTUALIZACIÓN DataFrame.sort está en desuso; use DataFrame.sort_values .

>>> df.sort_values([''c1'',''c2''], ascending=[False,True]) c1 c2 0 3 10 3 2 15 1 2 30 4 2 100 2 1 20 >>> df.sort([''c1'',''c2''], ascending=[False,True]) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/ampawake/anaconda/envs/pseudo/lib/python2.7/site-packages/pandas/core/generic.py", line 3614, in __getattr__ return object.__getattribute__(self, name) AttributeError: ''DataFrame'' object has no attribute ''sort''

RESPUESTA ORIGINAL

Tu código funciona para mí.

>>> import pandas >>> df = pandas.DataFrame([{''c1'':3,''c2'':10},{''c1'':2, ''c2'':30},{''c1'':1,''c2'':20},{''c1'':2,''c2'':15},{''c1'':2,''c2'':100}]) >>> df.sort([''c1'',''c2''], ascending=[False,True]) c1 c2 0 3 10 3 2 15 1 2 30 4 2 100 2 1 20

¿Pegaste como está?

>>> df.sort([''c1'',''c2''], ascending=[True,True]) c1 c2 2 1 20 3 2 15 1 2 30 4 2 100 0 3 10