Eu preciso usar funções diferentes para tratar colunas numéricas e colunas de seqüência de caracteres. O que estou fazendo agora é realmente burro:
allc = list((agg.loc[:, (agg.dtypes==np.float64)|(agg.dtypes==np.int)]).columns)
for y in allc:
treat_numeric(agg[y])
allc = list((agg.loc[:, (agg.dtypes!=np.float64)&(agg.dtypes!=np.int)]).columns)
for y in allc:
treat_str(agg[y])
Existe uma maneira mais elegante de fazer isso? Por exemplo
for y in agg.columns:
if(dtype(agg[y]) == 'string'):
treat_str(agg[y])
elif(dtype(agg[y]) != 'string'):
treat_numeric(agg[y])
string
não é um tipoRespostas:
Você pode acessar o tipo de dados de uma coluna com
dtype
:fonte
treat_numeric
função (não especificada) . Desde que ele incluiuagg.dtypes==np.float64
como uma opção, eu fiz também.number
: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html A solução geral éis_numeric_dtype(agg[y])
Em
pandas 0.20.2
você pode fazer:Portanto, seu código se torna:
fonte
pandas.core.common.is_numeric_dtype
existe desde Pandas 0,13, e ele faz a mesma coisa, mas foi preterido em favor depandas.api.types.is_numeric_dtype
, em 0,19, eu achoEu sei que isso é um pouco antigo, mas com o pandas 19.02, você pode fazer:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
fonte
include[np.number]
(para incluir também entradas e flutuadores de 32 bits) para a primeira linha eexclude[object]
para a segunda linha. Strings são objetos no que diz respeito a tipos. De fato, incluir 'string' com objeto gera um erro.'period'
dtype está aumentandoNotImplementedError
por enquanto (pandas 0.24.2). Portanto, pode ser necessário algum pós-processamento artesanal.O título da pergunta feita é geral, mas o caso de uso dos autores indicado no corpo da pergunta é específico. Portanto, qualquer outra resposta pode ser usada.
Mas, para responder totalmente à pergunta do título , deve ser esclarecido que parece que todas as abordagens podem falhar em alguns casos e exigir algum retrabalho. Eu revi todos eles (e alguns adicionais) na diminuição da ordem de confiabilidade (na minha opinião):
1. Comparando tipos diretamente via
==
(resposta aceita).Apesar do fato de essa resposta ser aceita e ter mais votos positivos, acho que esse método não deve ser usado. Porque, de fato, essa abordagem é desencorajada em python, como mencionado várias vezes aqui .
Mas se alguém ainda quiser usá-lo - deve estar ciente de alguns tipos específicos de pandas
pd.CategoricalDType
, comopd.PeriodDtype
, oupd.IntervalDtype
. Aqui é preciso usar extratype( )
para reconhecer o dtype corretamente:Outra ressalva aqui é que esse tipo deve ser apontado com precisão:
2.
isinstance()
abordagem.Este método não foi mencionado nas respostas até agora.
Portanto, se a comparação direta de tipos não é uma boa idéia - vamos tentar a função python interna para esse fim, a saber -
isinstance()
.Ele não apenas no início, porque assume que temos alguns objetos, mas
pd.Series
oupd.DataFrame
pode ser usado como apenas recipientes vazios com pré-definidosdtype
, mas não objetos nele:Mas se alguém de alguma forma superar esse problema, e quiser acessar cada objeto, por exemplo, na primeira linha e verificar seu dtype da seguinte forma:
Isso será enganoso no caso de dados mistos em coluna única:
E por último mas não menos importante - esse método não pode reconhecer diretamente o
Category
tipo. Conforme declarado nos documentos :Portanto, esse método também é quase inaplicável.
3.
df.dtype.kind
abordagem.Esse método ainda pode funcionar com vazio
pd.Series
oupd.DataFrames
com outros problemas.Primeiro - não é possível diferenciar alguns tipos:
Segundo, o que ainda não está claro para mim, ele ainda retorna com alguns tipos Não .
4.
df.select_dtypes
abordagem.Isso é quase o que queremos. Esse método foi desenvolvido dentro dos pandas para lidar com a maioria dos casos de canto mencionados anteriormente - DataFrames vazios, difere bem os tipos numpy ou específicos de pandas. Funciona bem com um tipo único
.select_dtypes('bool')
. Pode ser usado mesmo para selecionar grupos de colunas com base no dtype:Assim, conforme declarado nos documentos :
Podemos pensar que aqui vemos os primeiros resultados inesperados (costumava ser para mim: pergunta ) -
TimeDelta
são incluídos na saídaDataFrame
. Mas, como respondido em contrário, deve ser assim, mas é preciso estar ciente disso. Observe que obool
dtype é ignorado, o que também pode ser indesejável para alguém, mas é devido abool
enumber
está em " subárvores " diferentes de tipos numpy. No caso de bool, podemos usartest.select_dtypes(['bool'])
aqui.A próxima restrição desse método é que, para a versão atual do pandas (0.24.2), esse código:
test.select_dtypes('period')
será geradoNotImplementedError
.E outra coisa é que não é possível diferenciar strings de outros objetos:
Mas este é o primeiro - já mencionado na documentação. E segundo - não é o problema desse método, mas a maneira como as strings são armazenadas
DataFrame
. Mas de qualquer maneira, este caso precisa ter algum pós-processamento.5.
df.api.types.is_XXX_dtype
abordagem.Este pretende ser a maneira mais robusta e nativa de obter reconhecimento de tipo (caminho do módulo em que as funções residem diz por si só), como suponho. E funciona quase perfeitamente, mas ainda tem pelo menos uma ressalva e ainda precisa distinguir de alguma forma as colunas de string .
Além disso, isso pode ser subjetivo, mas essa abordagem também possui um
number
processamento de grupo de tipos de tipo 'compreensível ao ser humano' comparado com.select_dtypes('number')
:Não
timedelta
ebool
está incluído. Perfeito.Meu pipeline explora exatamente essa funcionalidade nesse momento, além de um pouco de processamento pós-mão.
Resultado.
Espero ter conseguido argumentar sobre o ponto principal - que todas as abordagens discutidas possam ser usadas, mas apenas
pd.DataFrame.select_dtypes()
epd.api.types.is_XXX_dtype
devem ser realmente consideradas como as aplicáveis.fonte
Se você deseja marcar o tipo de uma coluna de quadro de dados como uma sequência, você pode:
Um exemplo:
A resposta para o seu código:
fonte
Para imprimir os tipos de dados da coluna
Para verificar os tipos de dados após, por exemplo, uma importação de um arquivo
Saída ilustrativa:
fonte