Tengo una lista de valores con el índice de columna que quiero para cada fila de un DataFrame de pandas. ¿Cómo asigno esta lista de etiquetas de columna a cada fila del DataFrame?
Si simplemente indexo el DataFrame usando la lista, la lista completa se aplica a cada fila, así.
In [10]: df = pd.DataFrame(np.random.randn(5,2), columns=list('AB'))
In [11]: df
Out[11]:
A B
0 -0.082240 -2.182937
1 0.380396 0.084844
2 0.432390 1.519970
3 -0.493662 0.600178
4 0.274230 0.132885
In[12]: selection = list('ABBAA')
In[13]: selection
Out[13]: ['A', 'B', 'B', 'A', 'A']
In[14]: df[selection]
Out[14]:
A B B A A
0 -0.082240 -2.182937 -2.182937 -0.082240 -0.082240
1 0.380396 0.084844 0.084844 0.380396 0.380396
2 0.432390 1.519970 1.519970 0.432390 0.432390
3 -0.493662 0.600178 0.600178 -0.493662 -0.493662
4 0.274230 0.132885 0.132885 0.274230 0.274230
Cada elemento en la lista de selección indica la columna para seleccionar de la fila correspondiente en el DataFrame. En este ejemplo, quiero la columna A
de la primera fila, B
de la segunda y la tercera, luego A
de la cuarta y la quinta. Resulta que esta es la diagonal del resultado anterior. Mi DataFrame real es mucho más grande y no creo que tenga sentido construir el resultado anterior solo para seleccionar la diagonal.
Ciertamente puedo llegar a esto recorriendo las filas, pero espero que Pandas tenga una forma incorporada de hacer esto. Estoy buscando el método para obtener el siguiente resultado.
In[15]: df <do something> selection
Out[15]:
0 -0.082240
1 0.084844
2 1.519970
3 -0.493662
4 0.274230
Está cortando el marco de datos dos veces si primero selecciona columnas según la selección y luego obtiene los valores diagonales. En su lugar, puede usar la búsqueda que devuelve una matriz de los valores correspondientes a cada par (fila, columna).
df.lookup(df.index, selection)
array([-0.08224 , 0.084844, 1.51997 , -0.493662, 0.27423 ])
Si desea los datos en forma de serie Pandas,
pd.Series(df.lookup(df.index, selection))
0 -0.082240
1 0.084844
2 1.519970
3 -0.493662
4 0.274230
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras