web-dev-qa-db-fra.com

Comment définir des types par colonne dans pandas DataFrame

Je veux apporter des données dans un DataFrame pandas et je veux assigner des types pour chaque colonne lors de l'importation. Je veux pouvoir le faire pour des jeux de données plus volumineux comportant de nombreuses colonnes différentes, mais à titre d'exemple:

myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes

résulte en:

TypeError: type de données non compris

J'ai essayé quelques autres méthodes telles que:

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})

TypeError: l'objet de type 'type' n'a pas de len ()

Si je mets dtype=(float,int), un format flottant est appliqué aux deux colonnes.

En fin de compte, je voudrais simplement pouvoir lui transmettre une liste de types de données de la même manière que je peux lui transmettre une liste de noms de colonnes.

28
Chris

Je viens d’être confronté à cela, et le problème des pandas est toujours ouvert, alors je publie ma solution de contournement. En supposant que df est mon DataFrame et dtype est un dict mappant les noms de colonne sur les types:

for k, v in dtype.items():
    df[k] = df[k].astype(v)

(note: utilisez dtype.iteritems() en python 2)

Pour la référence:

13
mattexx

Vous voudrez peut-être essayer de passer un dictionnaire d'objets Series au constructeur DataFrame - cela vous donnera un contrôle beaucoup plus spécifique sur la création et devrait, espérons-le, être plus clair. Une version de modèle (data1 peut être un tableau, etc.):

df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
                   'column2':pd.Series(data2, dtype='type2')})

Et exemple avec des données:

df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'),
                   'B':pd.Series([7,8,9], dtype='float')})

print (df)
   A  B
0  1  7.0
1  2  8.0
2  3  9.0

print (df.dtypes)
A     int32
B    float64
dtype: object
3
DBCerigo