Je travaille avec un fichier csv et j'ai de nombreuses lignes qui contiennent des mots dupliqués et je souhaite supprimer les doublons (je ne veux pas non plus perdre l'ordre des phrases).
Exemple de fichier csv (userID et description sont le nom des colonnes):
userID, description 12, hello world 13, I will keep the 2000 followers same 14, I paid $2000 to the car . .
Je voudrais avoir la sortie comme:
userID, description 12, hello world hello world 13, I will keep the 2000 followers same I will keep the 2000 followers same 14, I paid $2000 to the car I paid $2000 to the car I paid $2000 to the car . .
J'ai déjà essayé le message tel que 1 2 3 mais aucun d'entre eux n'a résolu mon problème et n'a rien changé. (L'ordre pour mon fichier de sortie est important, car je ne veux pas perdre les commandes). Ce serait formidable si vous pouviez fournir votre aide avec un exemple de code que je peux exécuter à mes côtés et apprendre. Merci
[J'utilise la version Python 3.7]
4 Réponses :
Le code ci-dessous fonctionne pour moi:
0 hello world 1 I will keep the 2000 followers same 2 I paid $2000 to the car dtype: object
Fondamentalement, l'idée est de, pour chaque mot, ne le conserver que si sa position est la première dans la liste (séparée de la chaîne en utilisant un espace) . Cela signifie que si le mot s'est produit la deuxième fois (ou plus), la fonction .index () retournera un index plus petit que la position de l'occurrence actuelle, et sera donc éliminée.
Cela vous donnera:
a = pd.Series(["hello world hello world",
"I will keep the 2000 followers same I will keep the 2000 followers same",
"I paid $2000 to the car I paid $2000 to the car I paid $2000 to the car"])
a.apply(lambda x: " ".join([w for i, w in enumerate(x.split()) if x.split().index(w) == i]))
Votre code donnerait une mauvaise réponse à "Je garderai les 2000 abonnés identiques Je garderai les 2000 abonnés identiques" (notez qu'il y a 2 les dans la phrase.)
@Yilun Zhang Merci pour vos commentaires et votre code. Si je modifie votre code comme: data = pd.read_csv ('someCSv.csv', error_bad_lines = False); a = pd.Series (données) a.apply (lambda x: "" .join ([w pour i, w dans enumerate (x.split ()) si x.split (). index (w) == i] )) J'obtiens ValueError: Mauvais nombre d'éléments passés 2 . Pouvez-vous modifier votre code pour le faire avec l'entrée csv, puis l'enregistrer dans csv. (Je suis nouveau en python!)
@Bilgin au lieu de a = pd.Series (data) , essayez data ['description']
@QuangHoang Bon point, je vais devoir le revoir pour voir comment le résoudre.
Merci pour votre commentaire. J'ai essayé votre code comme: `import pandas as pd data = pd.read_csv ('some.csv', error_bad_lines = False); def principal_period (s): i = (s + s) .find (s, 1, -1) return None if i == -1 else s [: i] k = data ['description']. apply (principal_period) `et j'obtiens la sortie comme:` 0 Aucun 1 Aucun 2 Aucun Nom: description, dtype: objet`. Pouvez-vous s'il vous plaît modifier votre code dans un wat qui prend l'entrée comme csv et la sortie csv. (je suis nouveau en python) merci
Désolé, vérifiez la mise à jour. La fonction doit simplement renvoyer s [: i]
merci pour votre code. Maintenant, j'utilise import pandas comme pd data = pd.read_csv ('input.csv', error_bad_lines = False); def principal_period (s): i = (s + s) .find (s, 1, -1) return s [: i] k = data ['description']. apply (principal_period) mais ce n'est pas le cas supprimer les doublons de mon côté. Pouvez-vous s'il vous plaît vérifier mon code. Merci
Réponse tirée de Comment puis-je savoir si une chaîne se répète en Python?
import pandas as pd
def principal_period(s):
s+=' '
i = (s + s).find(s, 1, -1)
return None if i == -1 else s[:i]
df=pd.read_csv(r'path\to\filename_in.csv')
df['description'].apply(principal_period)
df.to_csv(r'output\path\filename_out.csv')
Explication:
J'ai ajouté un espace à la fin pour tenir compte du fait que les chaînes répétitives sont délimitées par espace. Ensuite, il recherche la deuxième chaîne apparaissant (moins le premier et le dernier caractère pour éviter la correspondance en premier, et le dernier en l'absence de chaînes répétitives, respectivement) lorsque la chaîne est ajoutée à elle-même. Cela trouve efficacement la position de la chaîne où commence la deuxième chaîne apparaissant ou où la première chaîne répétitive la plus courte se termine. Ensuite, cette chaîne répétitive est renvoyée.
Bien que cet extrait de code puisse résoudre le problème, il n'explique pas pourquoi ni comment il répond à la question. Veuillez inclure une explication de votre code, car cela contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
@BryceHowitson a ajouté une explication
Pour supprimer les doublons, je suggère une solution impliquant la structure de données OrderedDict:
df['Desired'] = (df['Current'].str.split()
.apply(lambda x: OrderedDict.fromkeys(x).keys())
.str.join(' '))
Veuillez formater votre code / données.
@VictorHugoBorges bien sûr. Merci. s'il vous plaît laissez-moi savoir si maintenant regardez bien.
Double possible de Comment puis-je savoir si une chaîne se répète en Python?
@RickyKim Je vérifie déjà ce message et il ne répond pas à ma question. J'ai déjà inclus comme référence dans ce post (# 3)
@Bilgin voyez ma réponse. cela fonctionne pour les 3 exemples que vous avez fournis