obter lista de colunas de dataframe do pandas com base no tipo de dados


184

Se eu tiver um quadro de dados com as seguintes colunas:

1. NAME                                     object
2. On_Time                                      object
3. On_Budget                                    object
4. %actual_hr                                  float64
5. Baseline Start Date                  datetime64[ns]
6. Forecast Start Date                  datetime64[ns] 

Eu gostaria de poder dizer: aqui está um dataframe, me dê uma lista das colunas que são do tipo Object ou do tipo DateTime?

Eu tenho uma função que converte números (Float64) em duas casas decimais e gostaria de usar esta lista de colunas de quadro de dados, de um tipo específico, e executá-la nessa função para convertê-las em 2dp.

Talvez:

For c in col_list: if c.dtype = "Something"
list[]
List.append(c)?

4
Quando cheguei a essa pergunta, estava procurando uma maneira de criar exatamente a lista no topo. df.dtypesfaz isso.
Martin Thoma

Os visitantes também podem estar interessados ​​nesta pergunta diferente, mas relacionada, sobre como encontrar todos os tipos de objetos em cada coluna : Como eu detecte subtipos nas colunas de objetos do pandas? .
jpp

Respostas:


315

Se você deseja uma lista de colunas de um determinado tipo, pode usar groupby:

>>> df = pd.DataFrame([[1, 2.3456, 'c', 'd', 78]], columns=list("ABCDE"))
>>> df
   A       B  C  D   E
0  1  2.3456  c  d  78

[1 rows x 5 columns]
>>> df.dtypes
A      int64
B    float64
C     object
D     object
E      int64
dtype: object
>>> g = df.columns.to_series().groupby(df.dtypes).groups
>>> g
{dtype('int64'): ['A', 'E'], dtype('float64'): ['B'], dtype('O'): ['C', 'D']}
>>> {k.name: v for k, v in g.items()}
{'object': ['C', 'D'], 'int64': ['A', 'E'], 'float64': ['B']}

5
Isso é útil como uma verificação de qualidade de dados, na qual se garante que as colunas sejam do tipo que se espera.
NYCeyes

2
isso não funcionará se todas as suas colunas do quadro de dados estiverem retornando objecttipo, independentemente do conteúdo real #
user5359531 17/17/17

2
@ user5359531 que não significa que não está funcionando, na verdade significa que suas colunas do DataFrame não foram convertidas para o tipo que você pensa que deveria ser, o que pode acontecer por vários motivos.
Marc

6
Se você está apenas selecionando colunas por tipo de dados, essa resposta é obsoleta. Utilize select_dtypesvez
Ted Petrou

Como você indexa esse quadro de dados agrupado posteriormente?
Allen Wang

110

No pandas v0.14.1, você pode utilizar select_dtypes()para selecionar colunas por dtype

In [2]: df = pd.DataFrame({'NAME': list('abcdef'),
    'On_Time': [True, False] * 3,
    'On_Budget': [False, True] * 3})

In [3]: df.select_dtypes(include=['bool'])
Out[3]:
  On_Budget On_Time
0     False    True
1      True   False
2     False    True
3      True   False
4     False    True
5      True   False

In [4]: mylist = list(df.select_dtypes(include=['bool']).columns)

In [5]: mylist
Out[5]: ['On_Budget', 'On_Time']

35

Usando dtypevocê fornecerá o tipo de dados da coluna desejada:

dataframe['column1'].dtype

se você quiser conhecer os tipos de dados de toda a coluna de uma só vez , poderá usar o plural de dtypecomo dtypes :

dataframe.dtypes

1
Essa deve ser a resposta aceita, pois imprime os tipos de dados quase exatamente no formato que o OP deseja.
Abhishek Divekar

1
Pergunta foi sobre listando apenas o tipo de dados específico, por exemplo, usando df.select_dtypes(include=['Object','DateTime']).columnscomo discutido abaixo
dFac

29

Você pode usar a máscara booleana no atributo dtypes:

In [11]: df = pd.DataFrame([[1, 2.3456, 'c']])

In [12]: df.dtypes
Out[12]: 
0      int64
1    float64
2     object
dtype: object

In [13]: msk = df.dtypes == np.float64  # or object, etc.

In [14]: msk
Out[14]: 
0    False
1     True
2    False
dtype: bool

Você pode ver apenas essas colunas com o tipo desejado:

In [15]: df.loc[:, msk]
Out[15]: 
        1
0  2.3456

Agora você pode usar round (ou qualquer outra coisa) e atribuí-lo de volta:

In [16]: np.round(df.loc[:, msk], 2)
Out[16]: 
      1
0  2.35

In [17]: df.loc[:, msk] = np.round(df.loc[:, msk], 2)

In [18]: df
Out[18]: 
   0     1  2
0  1  2.35  c

Eu adoraria poder escrever uma função que leva o nome de um quadro de dados e, em seguida, retorna um dicionário de listas, com a chave do dicionário como o tipo de dados e o valor como a lista de colunas do quadro de dados que são desse tipo. tipo de dados.
yoshiserry

def col_types (x, pd):
itthrill 28/08

14
list(df.select_dtypes(['object']).columns)

Isso deve fazer o truque


7

use df.info(verbose=True)where dfé um datafarme de pandas, por padrãoverbose=False


pode haver problemas de memória se a tabela for grande
Koo

4

A maneira mais direta de obter uma lista de colunas de um determinado tipo, por exemplo, 'objeto':

df.select_dtypes(include='object').columns

Por exemplo:

>>df = pd.DataFrame([[1, 2.3456, 'c', 'd', 78]], columns=list("ABCDE"))
>>df.dtypes

A      int64
B    float64
C     object
D     object
E      int64
dtype: object

Para obter todas as colunas dtype 'object':

>>df.select_dtypes(include='object').columns

Index(['C', 'D'], dtype='object')

Apenas para a lista:

>>list(df.select_dtypes(include='object').columns)

['C', 'D']   

3

Se você quiser uma lista apenas das colunas de objetos, poderá fazer:

non_numerics = [x for x in df.columns \
                if not (df[x].dtype == np.float64 \
                        or df[x].dtype == np.int64)]

e se você deseja obter outra lista apenas dos numéricos:

numerics = [x for x in df.columns if x not in non_numerics]

0

Eu vim com este forro de três .

Basicamente, aqui está o que ele faz:

  1. Busque os nomes das colunas e seus respectivos tipos de dados.
  2. Opcionalmente, estou exibindo-o em um CSV.

inp = pd.read_csv('filename.csv') # read input. Add read_csv arguments as needed
columns = pd.DataFrame({'column_names': inp.columns, 'datatypes': inp.dtypes})
columns.to_csv(inp+'columns_list.csv', encoding='utf-8') # encoding is optional

Isso facilitou muito minha vida na tentativa de gerar esquemas em tempo real. Espero que isto ajude


0

para yoshiserry;

def col_types(x,pd):
    dtypes=x.dtypes
    dtypes_col=dtypes.index
    dtypes_type=dtypes.value
    column_types=dict(zip(dtypes_col,dtypes_type))
    return column_types

0

Eu uso infer_objects ()

Docstring: tentativa de inferir melhores tipos para colunas de objetos.

Tenta a conversão suave de colunas com tipo de objeto, deixando inalteradas as colunas não-objeto e inconversíveis. As regras de inferência são as mesmas da construção normal do Series / DataFrame.

df.infer_objects().dtypes

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.