【问题标题】:How to remove duplicated words in csv rows in python?如何在python中删除csv行中的重复单词?
【发布时间】:2019-05-27 20:36:08
【问题描述】:

我正在使用 csv 文件,我有很多行包含重复的单词,我想删除所有重复的单词(我也不想丢失句子的顺序)。

csv 文件示例(userID 和 description 是列名):

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

.

.

我希望输出为:

userID, description

12, hello world 

13, I will keep the 2000 followers same

14, I paid $2000 to the car 

.

.

我已经尝试过诸如123 之类的帖子,但它们都没有解决我的问题,也没有改变任何东西。 (我的输出文件的顺序很重要,因为我不想丢失订单)。如果你能提供一个代码示例,我可以在我身边运行并学习,那就太好了。 谢谢

[我用的是python 3.7版本]

【问题讨论】:

  • 请格式化您的代码/数据。
  • @VictorHugoBorges 当然。谢谢。如果现在看起来还可以,请告诉我。
  • @RickyKim 我已经检查了那个帖子,但它没有回答我的问题。我已经包含在这篇文章中作为参考(#3)
  • @Bilgin 看到我的回答。它适用于您提供的 3 个示例

标签: python pandas csv dataframe


【解决方案1】:

要删除重复项,我建议使用 OrderedDict 数据结构的解决方案:

df['Desired'] = (df['Current'].str.split()
                          .apply(lambda x: OrderedDict.fromkeys(x).keys())
                          .str.join(' '))

【讨论】:

    【解决方案2】:

    下面的代码对我有用:

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

    基本上这个想法是,对于每个单词,只有当它的位置是列表中的第一个时才保留它(使用空格从字符串中分割出来)。这意味着,如果单词出现第二次(或更多次),.index() 函数将返回一个小于当前出现位置的索引,因此将被消除。

    这会给你:

    0                            hello world
    1    I will keep the 2000 followers same
    2                I paid $2000 to the car
    dtype: object
    

    【讨论】:

    • 您的代码会给出错误答案“我将保持 2000 个关注者不变我将保持 2000 个关注者不变”(请注意,句子中有 2 个the。)
    • @Yilun Zhang 感谢您的 cmets 和代码。如果我将您的代码修改为:data = pd.read_csv('someCSv.csv', error_bad_lines=False); a = pd.Series(data) a.apply(lambda x: " ".join([w for i, w in enumerate(x.split()) if x.split().index(w) == i])) 我得到ValueError: Wrong number of items passed 2。您可以修改您的代码以使用输入 csv,然后将其保存到 csv。 (我是 python 新手!)
    • @Bilgin 而不是a=pd.Series(data),试试data['description']
    • @QuangHoang 好点,我需要重新审视它,看看如何解决它。
    【解决方案3】:

    解决方案取自here

    def principal_period(s):
        i = (s+s).find(s, 1)
        return s[:i]
    
    df['description'].apply(principal_period)
    

    输出:

    0                                 hello world
    1     I will keep the 2000 followers the same
    2                     I paid $2000 to the car
    Name: description, dtype: object
    

    由于这在字符串上使用apply,它可能会很慢。

    【讨论】:

    • 感谢您的评论。我将您的代码尝试为:` 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) ` 我得到的输出为:` 0 None 1 None 2 None Name: description, dtype: object`。您能否在将输入作为 csv 并输出 csv 的 wat 中修改您的代码。 (我是 python 新手)谢谢
    • 抱歉,请检查更新。该函数应该只是return s[:i]
    • 感谢您的代码。现在我正在使用import pandas as 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),但它并没有删除我身边的重复项。你能检查我的代码吗?谢谢
    【解决方案4】:

    答案来自How can I tell if a string repeats itself in 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')
    

    解释:

    我在末尾添加了一个空格,以说明重复的字符串由空格分隔。然后,当字符串添加到自身时,它会查找第二个出现的字符串(减去第一个和最后一个字符以避免第一个匹配,当没有重复字符串时分别为最后一个)。这有效地找到了第二个出现的字符串开始的字符串位置,或者第一个最短的重复字符串结束的位置。然后返回这个重复的字符串。

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请包括对您的代码的解释,因为这确实有助于提高您的帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • @BryceHowitson 补充说明
    猜你喜欢
    • 2018-11-20
    • 2021-08-09
    • 1970-01-01
    • 2020-05-11
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 2011-12-09
    相关资源
    最近更新 更多