obtenir la liste des colonnes pandas dataframe en fonction du type de données

Si j'ai un dataframe avec les colonnes suivantes:

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] 

Je voudrais pouvoir dire: Voici un dataframe, donnez-moi une liste des colonnes qui sont de type Object ou de type DateTime?

J'ai une fonction qui convertit les nombres (Float64) en deux décimales, et je voudrais utiliser cette liste de colonnes dataframe, d'un type particulier, et l'exécuter via cette fonction pour les convertir toutes en 2dp.

Peut-être:

For c in col_list: if c.dtype = "Something"
list[]
List.append(c)?
121
demandé sur yoshiserry 2014-03-18 08:54:22

10 réponses

Si vous voulez une liste de colonnes d'un certain type, vous pouvez utiliser 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']}
234
répondu DSM 2014-03-18 09:29:34

Comme des pandas v0.14.1, vous pouvez utiliser select_dtypes() pour sélectionner des colonnes par 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']
73
répondu qmorgan 2018-09-21 15:27:34

Vous pouvez utiliser un masque booléen sur l'attribut 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

Vous pouvez regarder uniquement les colonnes avec le dtype désiré:

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

Maintenant, vous pouvez utiliser round (ou autre) et le renvoyer:

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
22
répondu Andy Hayden 2014-03-18 05:38:28

L'utilisation de dtype vous donnera le type de données de la colonne souhaitée:

dataframe['column1'].dtype

Si vous voulez savoir les types de données de toutes les colonnes à la fois, vous pouvez utiliser le pluriel de dtype comme dtypes:

dataframe.dtypes
17
répondu Ashish Sahu 2017-05-08 17:01:39

Utilisez df.info()df est un datafarme pandas

4
répondu Koo 2018-03-07 07:43:09

Df.select_dtypes(['objet'])

Cela devrait faire l'affaire

2
répondu Tanmoy 2018-02-14 06:44:32

Si vous voulez une liste de seulement les colonnes d'objet, vous pouvez faire:

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

Et puis si vous voulez obtenir une autre liste de seulement les nombres:

numerics = [x for x in df.columns if x not in non_numerics]
1
répondu 2016-12-29 06:05:20

Le moyen le plus direct d'obtenir une liste de colonnes de certains dtype, par exemple 'object':

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

Par exemple:

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

Pour obtenir toutes les colonnes dtype' object':

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

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

Pour seulement la liste:

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

['C', 'D']   
0
répondu MLKing 2018-06-21 04:45:01

Je suis venu avec cette trois liner.

Essentiellement, voici ce qu'il fait:

  1. récupère les noms des colonnes et leurs types de données respectifs.
  2. Je l'envoie optionnellement à 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

Cela m'a rendu la vie beaucoup plus facile en essayant de générer des schémas à la volée. J'espère que cela aide

0
répondu geekidharsh 2018-07-27 20:23:25

Pour 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
répondu itthrill 2018-08-28 03:08:14