Tengo un marco de datos con algunas columnas como esta:
A B C
0
4
5
6
7
7
6
5
El rango posible de valores en A es solo de 0 a 7 .
Además, tengo una lista de 8 elementos como este:
List=[2,5,6,8,12,16,26,32] //There are only 8 elements in this list
Si el elemento en la columna A es n , necesito insertar el n- ésimo elemento de la Lista en una nueva columna, diga 'D'.
¿Cómo puedo hacer esto de una vez sin recorrer todo el marco de datos?
El marco de datos resultante se vería así:
A B C D
0 2
4 12
5 16
6 26
7 32
7 32
6 26
5 16
Nota: El marco de datos es enorme y la iteración es la última opción. Pero también puedo organizar los elementos en 'Lista' en cualquier otra estructura de datos como dict si es necesario.
Respuestas:
IIUC, si convierte su (desafortunadamente nombrado)
List
en unndarray
, simplemente puede indexarlo de forma natural.>>> import numpy as np >>> m = np.arange(16)*10 >>> m[df.A] array([ 0, 40, 50, 60, 150, 150, 140, 130]) >>> df["D"] = m[df.A] >>> df A B C D 0 0 NaN NaN 0 1 4 NaN NaN 40 2 5 NaN NaN 50 3 6 NaN NaN 60 4 15 NaN NaN 150 5 15 NaN NaN 150 6 14 NaN NaN 140 7 13 NaN NaN 130
Aquí construí uno nuevo
m
, pero si lo usam = np.asarray(List)
, lo mismo debería funcionar: los valores endf.A
seleccionarán los elementos apropiados dem
.Tenga en cuenta que si está usando una versión anterior de
numpy
, es posible quem[df.A.values]
deba usar en su lugar; en el pasado,numpy
no funcionó bien con otros, y algunas refactorizacionespandas
causaron algunos dolores de cabeza. Las cosas han mejorado ahora.fuente
Traceback (most recent call last):
File "./b.py", line 24, in <module>
d["D"] = m[d.A]
IndexError: unsupported iterator index
numpy
error antiguo . ¿d["D"] = m[d.A.values]
Funciona para ti?Simplemente asigne la lista directamente:
df['new_col'] = mylist
Alternativa
Convierta la lista en una serie o matriz y luego asigne:
se = pd.Series(mylist) df['new_col'] = se.values
o
df['new_col'] = np.array(mylist)
fuente
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
pd.Series
efecto del dtype? Quiero decir, ¿dejará flotadores como flotadores y cuerdas como cuerdas? ¿O los elementos dentro de la lista serán cadenas por defecto?Una solución que mejora la excelente de @sparrow.
Deje que df sea su conjunto de datos y mylist la lista con los valores que desea agregar al marco de datos.
Supongamos que desea llamar a su nueva columna simplemente, new_column
Primero convierta la lista en una serie:
Luego use la función de inserción para agregar la columna. Esta función tiene la ventaja de permitirle elegir en qué posición desea colocar la columna. En el siguiente ejemplo colocaremos la nueva columna en la primera posición desde la izquierda (estableciendo loc = 0)
df.insert(loc=0, column='new_column', value=column_values)
fuente
Primero, creemos el marco de datos que tenía, ignoraré las columnas B y C ya que no son relevantes.
df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]})
Y el mapeo que deseas:
mapping = dict(enumerate([2,5,6,8,12,16,26,32])) df['D'] = df['A'].map(mapping)
¡Hecho!
print df
Salida:
A D 0 0 2 1 4 12 2 5 16 3 6 26 4 7 32 5 7 32 6 6 26 7 5 16
fuente
D
partir de los elementos deA
yList
("Si el elemento de la columna A es n, necesito insertar el n-ésimo elemento de la Lista en una nueva columna, diga 'D'")np.array(List)[df.A]
ydf["A"].map(dict(enumerate(List)))
es principalmente una cuestión de preferencia.Vieja pregunta; ¡pero siempre trato de usar el código más rápido!
Tenía una lista enorme con 69 millones de uint64. np.array () fue el más rápido para mí.
df['hashes'] = hashes Time spent: 17.034842014312744 df['hashes'] = pd.Series(hashes).values Time spent: 17.141014337539673 df['key'] = np.array(hashes) Time spent: 10.724546194076538
fuente