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
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