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的方法,但是还没有解决这个问题。还是在合并列时有可能做到这一点?
将不胜感激任何帮助或建议。我目前正在使用Spyder(Python 3.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)