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?
3 Réponses :
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
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.
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
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.
@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.