Eu tenho um quadro de dados com uma coluna e gostaria de dividi-lo em duas colunas, com um cabeçalho de coluna como ' fips'
e o outro'row'
Meu dataframe df
fica assim:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
Não sei como usar df.row.str[:]
para atingir meu objetivo de dividir a célula da linha. Eu posso usar df['fips'] = hello
para adicionar uma nova coluna e preenchê-la hello
. Alguma ideia?
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()
ouread_fwf()
Respostas:
Pode haver uma maneira melhor, mas esta é uma abordagem:
fonte
index = df.index
e você é bom.split
método retorna NaN e otolist
método retornará esse valor como está (NaN), o que resultará emValueError
(para superar esse problema, você pode convertê-lo no tipo de string antes de dividir). Eu recomendo que você experimentá-lo em seu próprio país é a melhor forma de aprender :-)df
possui orow
cabeçalho da coluna? Você pode pensar que é algum tipo de atributo DataFrame, mas é bem claro que esse é o nome da coluna. Depende de você como criar e definir os cabeçalhos das colunas; portanto, se você usar um diferente, use-o (por exemplodf.my_column_name.split(...)
).Versão TL; DR:
Para o caso simples de:
A solução mais simples é:
Ou você pode criar um DataFrame com uma coluna para cada entrada da divisão automaticamente com:
Você deve usar
expand=True
se suas seqüências de caracteres tiverem um número não uniforme de divisões e desejarNone
substituir os valores ausentes.Observe como, em ambos os casos, o
.tolist()
método não é necessário. Nem ézip()
.Em detalhe:
A solução de Andy Hayden é mais excelente para demonstrar o poder do
str.extract()
método.Mas, para uma simples divisão sobre um separador conhecido (como, por hífens ou em branco), o
.str.split()
método é suficiente 1 . Opera em uma coluna (Série) de cadeias e retorna uma coluna (Série) de listas:1: Se você não tiver certeza do que os dois primeiros parâmetros
.str.split()
fazem, recomendo os documentos para a versão simples do método Python .Mas como você vai:
para:
Bem, precisamos dar uma olhada mais de perto no
.str
atributo de uma coluna.É um objeto mágico que é usado para coletar métodos que tratam cada elemento em uma coluna como uma sequência e, em seguida, aplica o método respectivo em cada elemento da maneira mais eficiente possível:
Mas também possui uma interface de "indexação" para obter cada elemento de uma string pelo seu índice:
Obviamente, essa interface de indexação
.str
não se importa realmente se cada elemento que está sendo indexado é realmente uma string, desde que possa ser indexado, portanto:Então, é uma simples questão de tirar vantagem da descompactação tupla do Python dos iteráveis
Obviamente, tirar um DataFrame da divisão de uma coluna de strings é tão útil que o
.str.split()
método pode fazer isso por você com oexpand=True
parâmetro:Portanto, outra maneira de realizar o que queríamos é fazer:
A
expand=True
versão, embora mais longa, possui uma vantagem distinta sobre o método de descompactação da tupla. A descompactação da tupla não lida bem com divisões de diferentes comprimentos:Mas
expand=True
lida bem com isso, colocandoNone
nas colunas para as quais não há "divisões" suficientes:fonte
.split()
método, que explicam os dois primeiros parâmetros melhor do que os documentos do Pandas.df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
Você pode extrair as diferentes partes com bastante nitidez usando um padrão regex:
Para explicar a regex um tanto longa:
\d
) e os nomeia"fips"
.A próxima parte:
Faz (
|
) uma das duas coisas:*
) de letras maiúsculas ou espaços ([A-Z ]
) e nomeia isso"state"
antes do final da sequência ($
),ou
.*
)state_code
antes do final da string ($
).No exemplo:
Observe que as duas primeiras linhas atingem o "estado" (deixando o NaN nas colunas county e state_code), enquanto as três últimas atingem o município, state_code (deixando o NaN na coluna state).
fonte
(?P<label>...)
sintaxe! Eu não tenho idéia do porquê de eu ter optado pelo regex mais complexo, claramente o mais simples poderia funcionar<group_name>
. Agora eu sei que isso torna meu código muito sucinto.fonte
Se você não deseja criar um novo quadro de dados ou se o seu quadro de dados tiver mais colunas do que as que você deseja dividir, você poderá:
fonte
zip argument #1 must support iteration
erro, python 2.7Você pode usar
str.split
por espaço em branco (separador padrão) e parâmetroexpand=True
paraDataFrame
atribuir a novas colunas:Modificação, se necessário, remover a coluna original com
DataFrame.pop
Como é o mesmo:
Se receber erro:
Você pode verificar e retornar 4 colunas
DataFrame
, não apenas 2:Em seguida, a solução é anexada nova
DataFrame
porjoin
:Com remover coluna original (se houver também outras colunas):
fonte
Se você deseja dividir uma string em mais de duas colunas com base em um delimitador, pode omitir o parâmetro 'maximum splits'.
Você pode usar:
Isso criará automaticamente tantas colunas quanto o número máximo de campos incluídos em qualquer uma das suas seqüências iniciais.
fonte
Surpreso, ainda não vi esse. Se você precisar apenas de duas divisões, eu recomendo. . .
Series.str.partition
partition
realiza uma divisão no separador e geralmente tem um bom desempenho.Se você precisar renomear as linhas,
Se você precisar associá-lo ao original, use
join
ouconcat
:fonte
Prefiro exportar a série correspondente dos pandas (ou seja, as colunas necessárias), usando a função aplicar para dividir o conteúdo da coluna em várias séries e depois associar as colunas geradas ao DataFrame existente. Obviamente, a coluna de origem deve ser removida.
por exemplo
Para dividir duas palavras, a função de strings deve ser algo assim:
fonte
Vi que ninguém havia usado o método das fatias, então aqui coloquei meus 2 centavos aqui.
Este método criará duas novas colunas.
fonte
Use
df.assign
para criar um novo df. Consulte http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyfonte