J'ai une trame de données Pandas qui contient une colonne de valeurs float64:

tempDF = pd.DataFrame({ 'id': [12,12,12,12,45,45,45,51,51,51,51,51,51,76,76,76,91,91,91,91],
                        'measure': [3.2,4.2,6.8,5.6,3.1,4.8,8.8,3.0,1.9,2.1,2.4,3.5,4.2,5.2,4.3,3.6,5.2,7.1,6.5,7.3]})

Je veux créer une nouvelle colonne contenant uniquement la partie entière. Ma première pensée a été d'utiliser .astype (int):

tempDF['int_measure'] = tempDF['measure'].astype(int)

Cela fonctionne bien mais, comme complication supplémentaire, la colonne que j'ai contient une valeur manquante:

tempDF.ix[10,'measure'] = np.nan

Cette valeur manquante entraîne l'échec de la méthode .astype (int) avec:

ValueError: Cannot convert NA to integer

Je pensais pouvoir arrondir les flottants dans la colonne de données. Cependant, la fonction .round (0) arrondira à l'entier le plus proche (supérieur ou inférieur) plutôt que d'arrondir vers le bas. Je ne trouve pas de fonction équivalente à ".floor ()" qui agira sur une colonne d'une trame de données Pandas.

Aucune suggestion?

7
user1718097 8 mars 2016 à 20:24

3 réponses

Meilleure réponse

Vous pouvez simplement appliquer numpy.floor;

import numpy as np

tempDF['int_measure'] = tempDF['measure'].apply(np.floor)

    id  measure  int_measure
0   12      3.2            3
1   12      4.2            4
2   12      6.8            6
...
9   51      2.1            2
10  51      NaN          NaN
11  51      3.5            3
...
19  91      7.3            7
10
Joachim Isaksson 8 mars 2016 à 17:31

Vous pouvez également essayer:

df.apply(lambda s: s // 1)

L'utilisation de np.floor est cependant plus rapide.

4
Alexander 8 mars 2016 à 17:42

Les réponses ici sont assez datées et à partir de pandas 0.25.2 (peut-être plus tôt) l'erreur

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

Ce qui serait

df.iloc[:,0] = df.iloc[:,0].astype(int)

Pour une colonne particulière.

0
dawg 11 nov. 2019 à 17:58