1
votes

remplacer «.0» de plusieurs colonnes

J'ai un fichier csv qui a besoin d'être nettoyé. Je veux supprimer ".0" qui apparaît parfois dans mes colonnes. Mais peu importe ce que j'ai essayé, cela me renvoie des erreurs ou supprime tout:

file_in[cols] = file_in[cols].astype(str).apply(lambda x: x.str.replace('.0','))

à quoi cela devrait ressembler:

file_in[cols] = file_in[cols].astype(str).str.replace('.0','')

J'ai essayé:

file_in[cols] = file_in[cols].astype(str).replace('.0','')

qui a supprimé tous les zéros ce qui n'est pas ce que je veux

J'ai essayé aussi:

cols = ['ArtNo','RechnNo','LiefeNo']
file_in[cols] = file_in[cols].astype(str).apply(lambda x: x.str.rstrip('.0'))

et

Pos;ArtNo;Netto;RechnNo;LiefeNo
100;3441223;820,4;1122;555
200;3441223;820,4;1122;555
300;1492133;224,88;123;2200
400;7000061;8,99;12000;2200
500;7003581;2,09;1111;100

qui m'a donné l'erreur " AttributeError: l'objet 'str' n'a pas d'attribut 'str "

J'ai vraiment je ne sais pas quoi faire d'autre: /

EDIT J'ai également essayé de remplacer en utilisant lambda:

Pos;ArtNo;Netto;RechnNo;LiefeNo
100;3441223;820,4;1122;555.0
200;3441223;820,4;1122;555.0
300;1492133;224,88;123.0;2200
400;7000061;8,99;12000;2200
500;7003581;2,09;1111.0;100

n'a pas fonctionné

EDIT 2 ne peut pas utiliser INT car mes colonnes peuvent parfois avoir des chaînes non seulement des nombres


3 commentaires

df [col] .astype (int) ?


Je ne peux pas utiliser cela, car les colonnes peuvent parfois avoir des chaînes ... Exemple pour la colonne "RechnNo", cela pourrait être abc et non 123


Et si vous utilisiez '\ .0' au lieu de '.0' ?


4 Réponses :


0
votes

try:

file_in[cols] = file_in[cols].astype(str).apply(lambda x: x.str.replace('.0',''))

Vous avez oublié un "non?


1 commentaires

ce code renvoie l'erreur: AttributeError: l'objet 'str' n'a pas d'attribut 'str'



1
votes

Essayez :

file_in[cols] = file_in[cols].astype(str).replace('\.0', '', regex=True)


2 commentaires

supprimé tous les zéros ... de "3300" j'ai obtenu "33" .. j'ai besoin de "3300" pour rester le même


Désolé, j'ai oublié d'échapper au point. Pouvez-vous essayer maintenant, @ AmilaBečirović?



3
votes

Essayez ceci. Notez le \ avant .0

file_in[cols] = file_in[cols].astype(str).replace('\.0*$','', regex=True)

Expliquez :
df.replace est par défaut regex = False . Sur regex = False , il considère le mot entier. Pour qu'il considère chaque caractère, nous devons définir regex = True . Dans les regex, le caractère . est considéré comme le modèle correspondant de tout caractère. Pour forcer l'expression régulière à le considérer comme un littéral. , nous devons l'échapper avec \ . C'est la raison pour laquelle nous avons besoin de \.0


6 commentaires

a fonctionné comme un charme: D ... mais pouvez-vous s'il vous plaît m'expliquer pourquoi l'utilisation de '\' a fonctionné .. pas vraiment sûr de bien comprendre cela


@ AmilaBečirović . correspond à n'importe quel caractère (c'est pourquoi dans ma réponse originale, il supprimait plus de caractères que prévu). Si vous voulez faire correspondre un point, vous devez ajouter une barre oblique inverse (`\`) avant lui (a.k.a. "échapper")


@ AmilaBečirović: j'ai ajouté une explication


merci, je ne savais pas que . est considéré comme le modèle correspondant


Il semble y avoir un problème ici, il convertirait "2.09" en "29".


@Philippe: vous avez raison. J'ai édité et ajouté la fin de l'ancre de chaîne pour gérer ce cas :)



0
votes

Programme complet:

import re
import sys

with open(sys.argv[1]) as fd:
    print(re.sub('\.0(?=[;\s])','',fd.read()), end='')

""" call with : python test.py input
"""


0 commentaires