Tengo un marco de datos de 20 x 4000 en Python usando pandas. Dos de estas columnas se nombran Year
y quarter
. Me gustaría crear una variable llamada period
que hagaYear = 2000
y quarter= q2
en 2000q2
.
¿Alguien puede ayudar con eso?
Si ambas columnas son cadenas, puede concatenarlas directamente:
df["period"] = df["Year"] + df["quarter"]
Si una (o ambas) columnas no están escritas en cadena, primero debe convertirlas (ellas),
df["period"] = df["Year"].astype(str) + df["quarter"]
Si necesita unir varias columnas de cadena, puede usar agg
:
df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)
Donde "-" es el separador.
add(dataframe.iloc[:, 0:10])
por ejemplo?sum
.dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)
mapa solo aplica la conversión de cadenas a todas las entradas.Produce este marco de datos
Este método se generaliza a un número arbitrario de columnas de cadena al reemplazar
df[['Year', 'quarter']]
con cualquier segmento de columna de su marco de datos, por ejemplodf.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)
.Puede consultar más información sobre el método apply () aquí
fuente
lambda x: ''.join(x)
es solo''.join
no?lambda x: ''.join(x)
construcción no hace nada; es como usar enlambda x: sum(x)
lugar de solosum
.''.join
, es decir:df['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
.join
solo tomastr
instancias en un iterable. Use amap
para convertirlos a todosstr
y luego usejoin
.Pequeños conjuntos de datos (<150rows)
o un poco más lento pero más compacto:
Conjuntos de datos más grandes (> 150rows)
ACTUALIZACIÓN: Gráfico de tiempo Pandas 0.23.4
Probémoslo en 200K filas DF:
ACTUALIZACIÓN: nuevos tiempos usando Pandas 0.19.0
Tiempo sin optimización de CPU / GPU (ordenado del más rápido al más lento):
Tiempo utilizando la optimización de CPU / GPU:
Respuesta contribución de @ anton-vbr
fuente
df.T.apply(lambda x: x.str.cat(sep=''))
El método
cat()
del.str
descriptor de acceso funciona muy bien para esto:cat()
incluso le permite agregar un separador, por ejemplo, suponga que solo tiene números enteros por año y período, puede hacer esto:Unirse a varias columnas es solo una cuestión de pasar una lista de series o un marco de datos que contiene todos menos la primera columna como parámetro a
str.cat()
invocar en la primera columna (Serie):Tenga en cuenta que si su marco / serie de datos de pandas tiene valores nulos, debe incluir el parámetro na_rep para reemplazar los valores de NaN con una cadena, de lo contrario, la columna combinada será NaN predeterminada.
fuente
lambda
omap
; También se lee más limpiamente.str.cat()
. Enmendaré la respuestasep
palabra clave? en pandas-0.23.4. ¡Gracias!sep
parámetro solo es necesario si tiene la intención de separar las partes de la cadena concatenada. Si recibe un error, muéstrenos su ejemplo de falla.Uso de una función lamba esta vez con string.format ().
Esto le permite trabajar con valores sin formato y sin cadenas según sea necesario.
fuente
fuente
Year
no es una cadenadf['Year'].astype(str) + '' + df['quarter'].astype(str)
Aunque la respuesta @silvado es bueno si se cambia
df.map(str)
adf.astype(str)
que será más rápido:fuente
Supongamos que su
dataframe
esdf
con columnasYear
yQuarter
.Supongamos que queremos ver el marco de datos;
Finalmente, concatene el
Year
y el de laQuarter
siguiente manera.Ahora puede
print
df
ver el marco de datos resultante.Si no desea el espacio entre el año y el trimestre, simplemente quítelo haciendo;
fuente
df['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
TypeError: Series cannot perform the operation +
cuando corrodf2['filename'] = df2['job_number'] + '.' + df2['task_number']
odf2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
.df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)
funcionó.dataframe
que creé arriba, verás que todas las columnas sonstring
s.Aquí hay una implementación que me parece muy versátil:
fuente
A medida que sus datos se insertan en un marco de datos, este comando debería resolver su problema:
fuente
más eficiente es
y aquí hay una prueba de tiempo:
final, cuando
sum
se usa (concat_df_str2), el resultado no es simplemente concat, sino que se transmite a entero.fuente
df.values[:, 0:3]
odf.values[:, [0,2]]
.generalizando a múltiples columnas, por qué no:
fuente
Usar
zip
podría ser aún más rápido:Grafico:
fuente
La solución más simple:
Solución Genérica
Pregunta solución específica
fuente
Esta solución utiliza un paso intermedio que comprime dos columnas del DataFrame en una sola columna que contiene una lista de los valores. Esto funciona no solo para cadenas sino también para todo tipo de tipos de columnas
Resultado:
fuente
Como muchos han mencionado anteriormente, debe convertir cada columna a cadena y luego usar el operador más para combinar dos columnas de cadena. Puede obtener una gran mejora en el rendimiento utilizando NumPy.
fuente
df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)
-> salida :TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')
. Tanto job_number como task_number son ints.df['Year'].values.astype(str) + df.quarter
Creo que la mejor manera de combinar las columnas en pandas es convirtiendo ambas columnas en un entero y luego en str.
fuente
Aquí está mi resumen de las soluciones anteriores para concatenar / combinar dos columnas con valores int y str en una nueva columna, usando un separador entre los valores de las columnas. Tres soluciones funcionan para este propósito.
fuente
Uso
.combine_first
.fuente
.combine_first
dará como resultado que el valor'Year'
se almacene en'Period'
, o, si es Nulo, el valor de'Quarter'
. No concatenará las dos cadenas y las almacenará'Period'
.Por ejemplo:
fuente
Uno puede utilizar Asignar método de la trama de datos :
fuente
o si los valores son como [2000] [4] y desea hacer [2000q4]
sustituyendo
.astype(str)
con.map(str)
obras también.fuente