python - type - selecionar colunas pandas




Alterar tipo de dados de colunas em pandas (5)

Aqui está uma função que recebe como argumentos um DataFrame e uma lista de colunas e coage todos os dados nas colunas para números.

# df is the DataFrame, and column_list is a list of columns as strings (e.g ["col1","col2","col3"])
# dependencies: pandas

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

Então, para o seu exemplo:

import pandas as pd

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['col1','col2','col3'])

coerce_df_columns_to_numeric(df, ['col2','col3'])

Eu quero converter uma tabela, representada como uma lista de listas, em um DataFrame Pandas. Como um exemplo extremamente simplificado:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)

Qual é a melhor maneira de converter as colunas para os tipos apropriados, neste caso, as colunas 2 e 3 em floats? Existe uma maneira de especificar os tipos ao converter para DataFrame? Ou é melhor criar primeiro o DataFrame e, em seguida, percorrer as colunas para alterar o tipo de cada coluna? Idealmente, gostaria de fazer isso de maneira dinâmica, porque pode haver centenas de colunas e não quero especificar exatamente quais colunas são do tipo. Tudo o que posso garantir é que cada coluna contém valores do mesmo tipo.


Eu pensei que tinha o mesmo problema, mas na verdade eu tenho uma ligeira diferença que torna o problema mais fácil de resolver. Para outros que procuram esta questão, vale a pena verificar o formato da sua lista de entrada. No meu caso, os números são inicialmente floats e não strings como na pergunta:

a = [['a', 1.2, 4.2], ['b', 70, 0.03], ['x', 5, 0]]

mas ao processar a lista muito antes de criar o dataframe eu perco os tipos e tudo se torna uma string.

Criando o quadro de dados por meio de um array numpy

df = pd.DataFrame(np.array(a))

df
Out[5]: 
   0    1     2
0  a  1.2   4.2
1  b   70  0.03
2  x    5     0

df[1].dtype
Out[7]: dtype('O')

fornece o mesmo quadro de dados da pergunta, em que as entradas nas colunas 1 e 2 são consideradas strings. No entanto fazendo

df = pd.DataFrame(a)

df
Out[10]: 
   0     1     2
0  a   1.2  4.20
1  b  70.0  0.03
2  x   5.0  0.00

df[1].dtype
Out[11]: dtype('float64')

realmente fornece um quadro de dados com as colunas no formato correto


Que tal agora?

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df
Out[16]: 
  one  two three
0   a  1.2   4.2
1   b   70  0.03
2   x    5     0

df.dtypes
Out[17]: 
one      object
two      object
three    object

df[['two', 'three']] = df[['two', 'three']].astype(float)

df.dtypes
Out[19]: 
one       object
two      float64
three    float64

Que tal criar dois quadros de dados, cada um com tipos de dados diferentes para suas colunas e, em seguida, anexá-los juntos?

d1 = pd.DataFrame(columns=[ 'float_column' ], dtype=float)
d1 = d1.append(pd.DataFrame(columns=[ 'string_column' ], dtype=str))

Resultados

In[8}:  d1.dtypes
Out[8]: 
float_column     float64
string_column     object
dtype: object

Depois que o dataframe é criado, você pode preenchê-lo com variáveis ​​de ponto flutuante na primeira coluna e strings (ou qualquer tipo de dados desejado) na segunda coluna.


este código abaixo mudará o tipo de dados da coluna.

df[['col.name1', 'col.name2'...]] = df[['col.name1', 'col.name2'..]].astype('data_type')

no lugar do tipo de dados você pode dar seu tipo de dados. o que você quer como str, float, int etc.







casting