1
votes

Conversion d'un nombre négatif au format chaîne en numérique lorsque vous signez comme à la fin

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 commentaires

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


3 Réponses :


1
votes

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


0 commentaires

1
votes

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 


1 commentaires

Bien sûr, cela peut être fait en une seule ligne comme stackoverflow.com/a/56333633/2314391



0
votes

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-


1 commentaires

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))