Tener un marco de datos que se ve así:

import pandas as pd 

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

Me pregunto cómo reorganizar el marco de datos cuando se tiene un orden diferente en una columna que se quiere aplicar a todos los demás, por ejemplo, si se cambió la columna A en este ejemplo.

 df2 = pd.DataFrame({'A': ['A3', 'A0', 'A2', 'A1'],
                     'B': ['B3', 'B0', 'B2', 'B1'],
                     'C': ['C3', 'C0', 'C2', 'C1'],
                     'D': ['D3', 'D0', 'D2', 'D1']},
                     index=[0, 1, 2, 3])
0
PEBKAC 7 sep. 2018 a las 17:27

3 respuestas

La mejor respuesta

Puede usar la indexación a través de set_index, reindex y reset_index. Asume que sus valores en A son únicos, que es el único caso en el que dicha transformación tendría sentido.

L = ['A3', 'A0', 'A2', 'A1']

res = df1.set_index('A').reindex(L).reset_index()

print(res)

    A   B   C   D
0  A3  B3  C3  D3
1  A0  B0  C0  D0
2  A2  B2  C2  D2
3  A1  B1  C1  D1
2
jpp 7 sep. 2018 a las 14:48

Puede usar el parámetro clave de la función ordenada:

import pandas as pd

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])


key = {'A3': 0, 'A0': 1, 'A2' : 2, 'A1': 3}
df1['A'] = sorted(df1.A, key=lambda e: key.get(e, 4))

print(df1)

Salida

    A   B   C   D
0  A3  B0  C0  D0
1  A0  B1  C1  D1
2  A2  B2  C2  D2
3  A1  B3  C3  D3

Al cambiar los valores de la clave, puede establecer el orden que desee.

ACTUALIZACIÓN

Si lo que quiere es alterar el orden de las otras columnas en función del nuevo orden de A, puede intentar algo como esto:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A3', 'A0', 'A2', 'A1'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])

key = [df1.A.values.tolist().index(k) for k in df2.A]
df2.B = df2['B'][key].tolist()
print(df2)

Salida

    A   B   C   D
0  A3  B3  C0  D0
1  A0  B0  C1  D1
2  A2  B2  C2  D2
3  A1  B1  C3  D3

Para alterar todas las columnas, simplemente aplique lo anterior para cada columna. Algo como esto:

for column in df2.columns.values:
    if column != 'A':
        df2[column] = df2[column][key].tolist()
print(df2)

Salida

    A   B   C   D
0  A3  B3  C3  D3
1  A0  B0  C0  D0
2  A2  B2  C2  D2
3  A1  B1  C1  D1
1
Dani Mesejo 7 sep. 2018 a las 14:48

¿Querías ordenar 1 fila específica? si es así, use:

df1.iloc[:1] = df1.iloc[:1].sort_index(axis=1,ascending=False)
print(df1)

Para todas las columnas use:

df1 = df1.sort_index(axis=0,ascending=False)

Para columnas específicas use la función iloc.

1
anky_91 7 sep. 2018 a las 14:34