J'ai certains nombres dans une colonne de mon dataframe qui ont des nombres négatifs dans un format de chaîne comme celui-ci: "500.00-" Je dois convertir chaque nombre négatif dans la colonne au format numérique. Je suis sûr qu'il existe un moyen simple de le faire, mais j'ai eu du mal à en trouver un spécifique au dataframe pandas. Toute aide serait grandement appréciée.
J'ai essayé la fonction to_numeric de base comme indiqué ci-dessous, mais elle ne la lit pas correctement. De plus, seuls certains des nombres dans la colonne sont négatifs, donc je ne peux pas simplement supprimer tous les signes négatifs et multiplier la colonne par 1.
Q1['Credit'] = pd.to_numeric(Q1['Credit'])
3 Réponses :
Exemple de données:
df.num.mask(df.num.str[-1].isin(['-','+']), df.num.str[-1].str.cat(df.num.str[:-1])).astype('float') Out[1941]: 0 50.0 1 -60.0 2 70.0 3 -80.0 Name: num, dtype: float64
Utilisation de l'accesseur de série str
pour vérifier le dernier chiffre. Si c'est '-'
ou '+'
, changez-le au premier plan. Utilisez df.mask
pour l'appliquer uniquement aux lignes ayant - / + comme suffixe. Enfin, astype
colonne à float
df: num 0 50.00 1 60.00- 2 70.00+ 3 -80.00
Peut-être un peu explicite mais fonctionnerait
# build a mask of negative numbers m_neg = Q1["Credit"].str.endswith("-") # remove - signs Q1["Credit"] = Q1["Credit"].str.rstrip("-") # convert to number Q1["Credit"] = pd.to_numeric(Q1["Credit"]) # Apply the mask to create the negatives Q1.loc[m_neg, "Credit"] *= -1
Bien sûr, cela peut être fait en une seule ligne comme stackoverflow.com/a/56333633/2314391
Prenons l'exemple de dataframe suivant:
Credit 0 -500.0 1 100.0 2 -300.0
Nous pouvons utiliser str.endswith
pour créer un masque qui indique les nombres négatifs. Ensuite, nous utilisons np.where
pour convertir conditionnellement les nombres en négatifs:
m1 = Q1['Credit'].str.endswith('-') m2 = Q1['Credit'].str[:-1].astype(float) Q1['Credit'] = np.where(m1, -m2, m2)
Sortie
Q1 = pd.DataFrame({'Credit':['500.00-', '100.00', '300.00-']}) Credit 0 500.00- 1 100.00 2 300.00-
Cela ne fonctionne pas toujours, puisque 50.01 sera renvoyé en tant que 50.0. Dans ce cas, la solution appropriée sera m1 = Q1 ['Credit']. Str.endswith ('-') m2 = Q1 ['Credit']. Str [: - 1] .astype (float) Q1 ['Credit'] = np.where (m1, -m2, Q1 ['Credit']. Astype (float))
Avez-vous peut-être lu ces données à partir d'une feuille de calcul Excel?
df.num.str.extract ('(\ d +. \ d +)', expand = False) .astype (float)
??Est-ce que cela répond à votre question? valeur de conversion comme flottant négatif s'il y a un signe "-" à la fin avec des pandas