Quero definir os dtype
s de várias colunas em pd.Dataframe
(tenho um arquivo que tive que analisar manualmente em uma lista de listas, pois o arquivo não era acessível pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
eu recebo
ValueError: entry not a 2- or 3- tuple
A única maneira de defini-los é percorrendo cada variável de coluna e reformulando com astype
.
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
Existe uma maneira melhor?
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"funciona" ... mas: sRespostas:
Desde 0,17, você deve usar as conversões explícitas:
(Como mencionado abaixo, não há mais "mágica",
convert_objects
foi descontinuado em 0.17)Você pode aplicá-los a cada coluna que deseja converter:
e confirme se o dtype está atualizado.
RESPOSTA ANTIGA / DESCONTINUADA para pandas 0,12 - 0,16: Você pode usar
convert_objects
para inferir melhores dtipos:Magia! (É triste ver seu uso suspenso.)
fonte
type.convert
em R um pouco; bom, mas deixa alguém desejando especificações explícitas em alguns casos.convert_objects()
que foi descontinuado ... não tenho certeza do que o substituiu?Para aqueles que vêm do Google (etc.) como eu:
convert_objects
está obsoleto desde 0.17 - se você usá-lo, receberá um aviso como este:Você deve fazer algo como o seguinte:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
fonte
pd.to_datetime, to_timedelta, to_numeric
essa deve ser a resposta aceita.você pode definir os tipos explicitamente com os pandas
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
e passar em um dicionário com os tipos que você desejadtype
aqui está um exemplo:
agora você pode ver que mudou
fonte
Outra maneira de definir os tipos de coluna é primeiro construir uma matriz de registros numpy com os tipos desejados, preenchê-la e depois passá-la para um construtor DataFrame.
fonte
enfrentando problema semelhante a você. No meu caso, tenho 1000 arquivos de logs da Cisco que preciso analisar manualmente.
Para ser flexível com campos e tipos, testei com sucesso usando StringIO + read_cvs que de fato aceita um dict para a especificação dtype.
Normalmente coloco cada um dos arquivos (5k-20k linhas) em um buffer e crio os dicionários dtype dinamicamente.
Eventualmente concateno (com categóricos ... graças ao 0,19) esses dataframes em um grande frame de dados que despejo em hdf5.
Algo nesse sentido
Não é muito python .... mas faz o trabalho
Espero que ajude.
JC
fonte
É melhor usar np.arrays digitado e, em seguida, passar os dados e os nomes das colunas como um dicionário.
fonte