J'ai essayé de convertir les valeurs de certaines colonnes d'un DataFrame de flottants en nombres entiers en utilisant round puis astype. Cependant, les valeurs contenaient toujours des décimales. Quel est le problème avec mon code?

nums = np.arange(1, 11)
arr = np.array(nums)
arr = arr.reshape((2, 5))
df = pd.DataFrame(arr)
df += 0.1
df

Df d'origine:

    0   1   2   3   4
0   1.1 2.1 3.1 4.1 5.1
1   6.1 7.1 8.1 9.1 10.1

Arrondir ensuite au code int:

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

Production:

    0   1   2   3   4
0   1.1 2.1 3.0 4.0 5.0
1   6.1 7.1 8.0 9.0 10.0

Production attendue:

    0   1   2   3   4
0   1.1 2.1 3   4   5
1   6.1 7.1 8   9   10
2
Daniel Poh 24 sept. 2020 à 17:30

2 réponses

Meilleure réponse

Le problème est que pour le .iloc, il attribue la valeur et n'a pas changé le type de colonne

l = df.columns[2:]
df[l] = df[l].astype(int)
df
     0    1  2  3   4
0  1.1  2.1  3  4   5
1  6.1  7.1  8  9  10
3
BENY 24 sept. 2020 à 14:36

Une façon de résoudre ce problème consiste à utiliser .convert_dtypes()

df.iloc[:, 2:] = df.iloc[:, 2:].round()
df = df.convert_dtypes()
print(df)

Production:

     0    1  2  3   4
0  1.1  2.1  3  4   5
1  6.1  7.1  8  9  10

Cela vous aidera à forcer tous les dtypes de votre dataframe à un meilleur ajustement.

2
Samuel Baptista 24 sept. 2020 à 14:58