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 cadre de données, 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 j'aimerais 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)?
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']}
À partir de pandas v0.14.1, vous pouvez utiliser select_dtypes()
pour sélectionner des colonnes par type
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']
Vous pouvez utiliser le 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 ces colonnes avec le type souhaité:
In [15]: df.loc[:, msk]
Out[15]:
1
0 2.3456
Maintenant vous pouvez utiliser round (ou autre chose) et le redonner:
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
Utiliser dtype
vous donnera le type de données de la colonne souhaitée:
dataframe['column1'].dtype
si vous voulez connaître les types de données de toutes les colonnes à la fois, vous pouvez utiliser le pluriel de dtype
comme dtypes :
dataframe.dtypes
utilisez df.info()
où df
est une base de données de pandas
df.select_dtypes(['object'])
Cela devrait faire l'affaire
Le moyen le plus direct d’obtenir une liste de colonnes de certains types, par ex. 'objet':
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 de type 'objet':
>>df.select_dtypes(include='object').columns
Index(['C', 'D'], dtype='object')
Pour juste la liste:
>>list(df.select_dtypes(include='object').columns)
['C', 'D']
Si vous voulez une liste des seules colonnes d'objets que 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 ensuite si vous souhaitez obtenir une autre liste contenant uniquement des valeurs numériques:
numerics = [x for x in df.columns if x not in non_numerics]
J'utilise infer_objects ()
Docstring: Essayez de déduire de meilleurs types pour les colonnes d'objet.
Tente une conversion logicielle des colonnes typées-objets, en laissant les colonnes non-objets et non convertibles inchangées. Les règles d'inférence sont les mêmes que lors de la construction normale de Series/DataFrame.
df.infer_objects().dtypes
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
Je suis venu avec ce trois paquebot .
En gros, voici ce que ça fait:
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 beaucoup facilité la vie en essayant de générer des schémas à la volée. J'espère que cela t'aides