Tengo un marco de datos con una columna y me gustaría dividirlo en dos columnas, con un encabezado de columna como ' fips'
y el otro'row'
Mi dataframe se df
ve así:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
No sé cómo usarlo df.row.str[:]
para lograr mi objetivo de dividir la celda de la fila. Puedo usar df['fips'] = hello
para agregar una nueva columna y completarla hello
. ¿Algunas ideas?
fips row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
read_table()
oread_fwf()
Respuestas:
Puede haber una mejor manera, pero este es un enfoque:
fuente
index = df.index
y eres buenosplit
método devuelve NaN y eltolist
método devolverá este valor tal como está (NaN), lo que dará como resultadoValueError
(para superar este problema, puede convertirlo al tipo de cadena antes de dividirlo). Te recomiendo que lo pruebes por tu cuenta, es la mejor manera de aprender :-)df
tiene elrow
encabezado de columna? Puede pensar que es algún tipo de atributo DataFrame, pero está bastante claro que este es el nombre de la columna. Depende de usted cómo crea y define sus encabezados de columna, de modo que si usa uno diferente, úselo (por ejemplodf.my_column_name.split(...)
).TL; versión DR:
Para el caso simple de:
La solución más simple es:
O puede crear crear un DataFrame con una columna para cada entrada de la división automáticamente con:
Debe usar
expand=True
si sus cadenas tienen un número no uniforme de divisiones y deseaNone
reemplazar los valores faltantes.Observe cómo, en cualquier caso, el
.tolist()
método no es necesario. Tampoco lo eszip()
.En detalle:
La solución de Andy Hayden es excelente para demostrar el poder del
str.extract()
método.Pero para una división simple sobre un separador conocido (como, división por guiones o división por espacios en blanco), el
.str.split()
método es suficiente 1 . Funciona en una columna (Serie) de cadenas y devuelve una columna (Serie) de listas:1: Si no está seguro de cuáles son los dos primeros parámetros
.str.split()
, recomiendo los documentos para la versión simple de Python del método .Pero como vas desde:
a:
Bueno, tenemos que echar un vistazo más de cerca al
.str
atributo de una columna.Es un objeto mágico que se utiliza para recopilar métodos que tratan cada elemento de una columna como una cadena, y luego aplica el método respectivo en cada elemento de la manera más eficiente posible:
Pero también tiene una interfaz de "indexación" para obtener cada elemento de una cadena por su índice:
Por supuesto, a esta interfaz de indexación
.str
realmente no le importa si cada elemento que está indexando es en realidad una cadena, siempre que pueda indexarse, por lo tanto:Entonces, es una simple cuestión de aprovechar el desempaquetado de tuplas de Python de iterables para hacer
Por supuesto, obtener un DataFrame al dividir una columna de cadenas es tan útil que el
.str.split()
método puede hacerlo por usted con elexpand=True
parámetro:Entonces, otra forma de lograr lo que queríamos es hacer:
La
expand=True
versión, aunque más larga, tiene una clara ventaja sobre el método de desempaquetado de tuplas. El desempaquetado de tuplas no funciona bien con divisiones de diferentes longitudes:Pero lo
expand=True
maneja bien colocandoNone
en las columnas para las que no hay suficientes "divisiones":fuente
.split()
método que explican los dos primeros parámetros mejor que los documentos de Pandas.df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
Puede extraer las diferentes partes con bastante cuidado utilizando un patrón regex:
Para explicar la expresión regular algo larga:
\d
) y los nombra"fips"
.La siguiente parte:
¿Alguna (
|
) una de dos cosas:*
) de letras mayúsculas o espacios ([A-Z ]
) y los nombra"state"
antes del final de la cadena ($
),o
.*
) entoncesstate_code
antes del final de la cadena ($
).En el ejemplo:
Tenga en cuenta que las dos primeras filas golpean el "estado" (dejando NaN en las columnas de condado y state_code), mientras que las tres últimas golpean el condado, código_de_Estado (dejando NaN en la columna de estado).
fuente
(?P<label>...)
sintaxis! No tengo idea de por qué opté por la expresión regular más compleja, claramente la simple podría funcionar hmmmm<group_name>
. Ahora sé que hace que mi código sea muy sucinto.fuente
Si no desea crear un nuevo marco de datos, o si su marco de datos tiene más columnas que las que desea dividir, podría:
fuente
zip argument #1 must support iteration
error, python 2.7Puede usar
str.split
por espacios en blanco (separador predeterminado) y parámetroexpand=True
paraDataFrame
asignar a nuevas columnas:Modificación si es necesario eliminar la columna original con
DataFrame.pop
¿Qué es lo mismo que:
Si obtiene un error:
Puede verificar y devolver 4 columnas
DataFrame
, no solo 2:Entonces la solución se agrega nueva
DataFrame
porjoin
:Con eliminar columna original (si también hay otras columnas):
fuente
Si desea dividir una cadena en más de dos columnas en función de un delimitador, puede omitir el parámetro 'divisiones máximas'.
Puedes usar:
Esto creará automáticamente tantas columnas como el número máximo de campos incluidos en cualquiera de sus cadenas iniciales.
fuente
Sorprendido no he visto este todavía. Si solo necesita dos divisiones, lo recomiendo encarecidamente. . .
Series.str.partition
partition
realiza una división en el separador, y generalmente es bastante eficiente.Si necesita cambiar el nombre de las filas,
Si necesita volver a unir esto al original, use
join
oconcat
:fuente
Prefiero exportar las series de pandas correspondientes (es decir, las columnas que necesito), usando la función de aplicación para dividir el contenido de la columna en varias series y luego unir las columnas generadas al DataFrame existente. Por supuesto, la columna fuente debe eliminarse.
p.ej
Para dividir dos palabras, la función de cadenas debería ser algo así:
fuente
Vi que nadie había usado el método de corte, así que aquí puse mis 2 centavos aquí.
Este método creará dos nuevas columnas.
fuente
Use
df.assign
para crear un nuevo df. Ver http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyfuente