ottenere l'elenco delle colonne dei frame di dati Panda in base al tipo di dati


184

Se ho un frame di dati con le seguenti colonne:

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] 

Vorrei poter dire: ecco un dataframe, dammi un elenco delle colonne che sono di tipo Object o di tipo DateTime?

Ho una funzione che converte i numeri (Float64) in due cifre decimali e vorrei utilizzare questo elenco di colonne di frame di dati, di un tipo particolare, ed eseguirlo attraverso questa funzione per convertirli tutti in 2dp.

Può essere:

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

4
Quando sono arrivato a questa domanda, stavo cercando un modo per creare esattamente l'elenco in alto. df.dtypesfa quello.
Martin Thoma,

I visitatori potrebbero anche essere interessati a questa domanda diversa ma correlata su come trovare tutti i tipi di oggetto all'interno di ogni colonna : Come posso rilevare i sottotipi nelle colonne di oggetti Panda? .
jpp

Risposte:


315

Se desideri un elenco di colonne di un determinato tipo, puoi utilizzare 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
Ciò è utile come controllo della qualità dei dati, in cui si garantisce che le colonne siano del tipo previsto.
NYCeyes,

2
questo non funziona se tutte le colonne del tuo frame di dati restituiscono il objecttipo, indipendentemente dal loro contenuto effettivo
user5359531

2
@utente5359531 ciò non significa che non funzioni, ciò significa che le colonne DataFrame non sono state trasmesse al tipo che ritieni debbano essere, il che può accadere per una serie di motivi.
Marc,

6
Se stai solo selezionando le colonne per tipo di dati, questa risposta è obsoleta. Usa select_dtypesinvece
Ted Petrou,

Come indicizzare successivamente questo frame di dati raggruppati?
Allen Wang

110

A partire da Panda v0.14.1, è possibile utilizzare select_dtypes()per selezionare le colonne per tipo

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

L'utilizzo dtypefornirà il tipo di dati desiderato per la colonna:

dataframe['column1'].dtype

se vuoi conoscere contemporaneamente i tipi di dati di tutta la colonna , puoi usare il plurale di dtypecome dtypes :

dataframe.dtypes

1
Questa dovrebbe essere la risposta accettata, stampa i tipi di dati quasi esattamente nel formato desiderato da OP.
Abhishek Divekar,

1
La domanda era df.select_dtypes(include=['Object','DateTime']).columns
sull'elencare

29

È possibile utilizzare la maschera booleana sull'attributo 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

Puoi guardare solo quelle colonne con il tipo desiderato:

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

Ora puoi usare round (o qualsiasi altra cosa) e assegnarlo di nuovo:

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

Mi piacerebbe poter scrivere una funzione che assume il nome di un frame di dati e quindi restituisce un dizionario di elenchi, con la chiave del dizionario come tipo di dati e il valore come l'elenco di colonne del frame di dati che sono di tale tipo di dati.
yoshiserry,

def col_types (x, pd):
itthrill

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

Questo dovrebbe fare il trucco


7

usa df.info(verbose=True)where dfis a panda datafarme, per impostazione predefinitaverbose=False


ci possono essere problemi di memoria se la tabella è grande
Koo

4

Il modo più diretto per ottenere un elenco di colonne di un determinato tipo, ad esempio "oggetto":

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

Per esempio:

>>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

Per ottenere tutte le colonne di tipo "oggetto":

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

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

Solo per l'elenco:

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

['C', 'D']   

3

Se si desidera un elenco delle sole colonne degli oggetti, è possibile:

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

e quindi se vuoi ottenere un altro elenco di soli numeri:

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

0

Ho pensato a questa tre fodera .

In sostanza, ecco cosa fa:

  1. Recupera i nomi delle colonne e i rispettivi tipi di dati.
  2. Opzionalmente lo sto inviando a un 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

Ciò ha reso la mia vita molto più semplice nel tentativo di generare schemi al volo. Spero che questo ti aiuti


0

per 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

Uso infer_objects ()

Docstring: Tentativo di dedurre migliori tipi di colonne di oggetti.

Tenta la conversione graduale di colonne a forma di oggetto, lasciando invariate le colonne non oggetto e non convertibili. Le regole di inferenza sono le stesse della normale costruzione Series / DataFrame.

df.infer_objects().dtypes

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.