2
votes

Stocker les entiers sous forme d'entiers et non de flottants

Je fais ce qui suit:

import pandas as pd

df_texts = pd.read_csv('data_texts.csv', keep_default_na=True)

for index, row in df_texts.iterrows():   

    list_of_words = row['text'].split()

    df_texts.loc[index, '#_words'] = len(list_of_words)

    list_of_unique_words = set(list_of_words)  

    df_texts.loc[index, '#_unique_words'] = len(list_of_unique_words)

Le problème est que les nombres dans les colonnes #_words et #_unique_words sont stockés sous forme de flottants même s'ils sont des entiers.

Juste pour préciser que ces deux colonnes ne pré-existent pas dans le .csv que j'ai lu ( pd.read_csv ) mais que je crée les dans la boucle for .

Comment puis-je les stocker directement sous forme d'entiers?


2 commentaires

@iamklaus cool mais ma question est toujours la suivante: comment puis-je les stocker directement sous forme d'entiers?


changez le type de données des colonnes après avoir inséré des valeurs dans la colonne ou créez une liste de valeurs et insérez-les ultérieurement.


3 Réponses :


0
votes

Vous pouvez appliquer la fonction int à la colonne requise:

    n
0   1
1   1
2   5
df= pd.DataFrame({
    'n':[1.12, 1.2345, 5.234]
})
df['n'] = df['n'].apply(lambda x: int(x))
df


1 commentaires

Je pourrais utiliser pd.to_numeric () aussi je pense (ce qui peut être plus efficace que votre solution ci-dessus) mais je cherche quand même (s'il existe) quelque chose d'encore plus efficace.



1
votes

Une meilleure façon de le faire et d'obtenir directement des entrées est d'attribuer directement les nouvelles colonnes et d'éviter d'itérer complètement dans le dataframe.

Avec quelques données factices pour un exemple:

temp = df_texts['text'].str.split()
df_texts['#_words'] = [len(row) for row in temp] #iterates and creates a list of all lengths. assign to df
df_texts['#_unique_words'] = [len(set(row)) for row in temp]

print(df_texts)
#Output:
                text  #_words  #_unique_words
0  word1 word2 word3        3               3
1  word1 word2 word1        3               2
2              word3        1               1


0 commentaires

0
votes

Si vous créez la colonne en attribuant une valeur à une seule ligne, toutes les autres lignes sont implicitement initialisées à NaN , qui est une valeur à virgule flottante. Cela force la colonne entière à float .

(Vous remarquerez également cela si vous essayez de convertir la colonne en utilisant df_texts ['#_ words'] = df_texts ['#_ words']. astype (int) avant que toutes les valeurs aient été définies . Cela échouera car NaN ne peut pas être converti en int .)

Par conséquent, la colonne ne peut pas devenir une colonne entière tant que toutes les valeurs ne sont pas définies. Le problème disparaît si vous initialisez la colonne entière avec df_texts ['#_ words'] = 0 avant la boucle.

Modifier: De plus, comme les autres réponses l'ont souligné, ce devoir peut être fait sans utiliser de boucle au départ.


0 commentaires