熊猫:合并没有重复的栏/合并后找到唯一的单词

K_B*_*_B1 1 python unique dataframe pandas python-3.5

我有一个要连接某些列的数据框。

我的问题是这些列中的文本可能包含也可能不包含重复信息。我想删除重复项,以便仅保留相关信息。

例如,如果我有一个数据框,例如:

pd.read_csv("animal.csv")

  animal1         animal2        label  
1 cat dog         dolphin        19
2 dog cat         cat            72
3 pilchard 26     koala          26
4 newt bat 81     bat            81
Run Code Online (Sandbox Code Playgroud)

我想合并列,但仅保留每个字符串中的唯一信息。

您可以在第2行中看到,在“ Animal1”和“ Animal2”列中都包含“ cat”。在第3行中,数字26在“ Animal1”和“ Label”列中。而在第4行中,“ Animal2”和“ Label”列中的信息已按顺序包含在“ Animal1”中。

我通过执行以下操作合并列

animals["detail"] = animals["animal1"].map(str) + animals["animal2"].map(str) + animals["label"].map(str)

  animal1         animal2        label        detail  
1 cat dog         dolphin        19           cat dog dolphin 19
2 dog cat         cat            72           dog cat cat 72
3 pilchard 26     koala          26           pilchard 26 koala 26
4 newt bat 81     bat            81           newt bat 81 bat 81
Run Code Online (Sandbox Code Playgroud)

第1行很好,但其他行当然也包含上述重复项。

我想要的输出是:

  animal1         animal2        label        detail  
1 cat dog         dolphin        19           cat dog dolphin 19
2 dog cat         cat            72           dog cat 72
3 pilchard 26     koala          26           pilchard koala 26
4 newt bat 81     bat            81           newt bat 81
Run Code Online (Sandbox Code Playgroud)

或者,如果我只能在详细信息列中每行保留每个单词/数字的第一个唯一实例,这也将是合适的,即:

  detail 
1 cat dog dolphin 19
2 dog cat 72
3 pilchard koala 26
4 newt bat 81
Run Code Online (Sandbox Code Playgroud)

我看过如何在python中为字符串执行此操作,例如, 如何使用Python删除字符串中的重复单词?如何获得数据框中所有唯一的单词?在pyspark数据框:python中显示不同的列值, 但无法弄清楚如何将其应用于detail列中的各个行。我已经考虑了在合并各列之后拆分文本,然后使用apply和lambda的方法,但是还没有解决这个问题。还是在合并列时有可能做到这一点?

在R中解决方案,但想在python中重新编码。

将不胜感激任何帮助或建议。我目前正在使用Spyder(Python 3.5)

jez*_*ael 5

您可以添加自定义函数,该函数首先按空格分隔,然后按分别获取唯一值pandas.unique,最后联接回字符串:

animals["detail"] = animals["animal1"].map(str) + ' ' + 
                    animals["animal2"].map(str) + ' ' +
                    animals["label"].map(str)

animals["detail"] = animals["detail"].apply(lambda x: ' '.join(pd.unique(x.split())))
print (animals)
       animal1  animal2  label              detail
1      cat dog  dolphin     19  cat dog dolphin 19
2      dog cat      cat     72          dog cat 72
3  pilchard 26    koala     26   pilchard 26 koala
4  newt bat 81      bat     81         newt bat 81
Run Code Online (Sandbox Code Playgroud)

在以下位置也可能是联接值apply

animals["detail"] = animals.astype(str)
                           .apply(lambda x: ' '.join(pd.unique(' '.join(x).split())),axis=1)
print (animals)
       animal1  animal2  label              detail
1      cat dog  dolphin     19  cat dog dolphin 19
2      dog cat      cat     72          dog cat 72
3  pilchard 26    koala     26   pilchard 26 koala
4  newt bat 81      bat     81         newt bat 81
Run Code Online (Sandbox Code Playgroud)

解决方案set,但更改了顺序:

animals["detail"] = animals.astype(str)
                           .apply(lambda x: ' '.join(set(' '.join(x).split())), axis=1)
print (animals)
       animal1  animal2  label              detail
1      cat dog  dolphin     19  cat dolphin 19 dog
2      dog cat      cat     72          cat dog 72
3  pilchard 26    koala     26   26 pilchard koala
4  newt bat 81      bat     81         bat 81 newt
Run Code Online (Sandbox Code Playgroud)