无法从CSV中提取唯一字词

时间:2016-09-08 07:18:07

标签: python list csv pandas unique

我有if (containsValue(searchx)) { ... do something ... } ,如下所示:

csv

我需要从这些数据中找出独特的单词。所以输出将是:

    Description
0   ['boy']
1   ['boy', 'jumped', 'roof']
2   ['paris']
3   ['paris', 'beautiful', 'new', 'york']
4   ['lets', 'go', 'party']
5   ['refused', 'come', 'party']

等等。我试图使用Pandas和Python来做到这一点,但无法实现它。我的代码是:

    Unique Words
0   boy
1   jumped
2   roof
3   paris
4   beautiful
5   new
6   york

这会抛出错误的输出,它只会抛出原始的csv数据帧。

2 个答案:

答案 0 :(得分:3)

您首先需要将string列转换为list,我使用ast.literal_eval。然后按列表推导制作列表的平面列表,使用set并最后按构造函数创建新的DataFrame

import ast

print (type(df.ix[0, 'Description']))
<class 'str'>

df.Description = df.Description.apply(ast.literal_eval)

print (type(df.ix[0, 'Description']))
<class 'list'>

#http://stackoverflow.com/q/952914/2901002
unique_data = list(set([item for sublist in df.Description.tolist() for item in sublist]))
print (unique_data)
['refused', 'jumped', 'go', 'roof', 'come', 'beautiful',
 'paris', 'york', 'lets', 'new', 'boy', 'party']

print (pd.DataFrame({'Unique Words': unique_data}))
   Unique Words
0       refused
1        jumped
2            go
3          roof
4          come
5     beautiful
6         paris
7          york
8          lets
9           new
10          boy
11        party

没有ast的另一种解决方案:

df.Description = df.Description.str.strip('[]').str.split(',')
print (df)
                                Description
0                                   ['boy']
1               ['boy',  'jumped',  'roof']
2                                 ['paris']
3  ['paris',  'beautiful',  'new',  'york']
4                 ['lets',  'go',  'party']
5            ['refused',  'come',  'party']

unique_data = list(set([item.strip().strip("'") for sublist in df.Description.tolist() for item in sublist]))
print (unique_data)
['refused', 'jumped', 'go', 'roof', 'come', 'beautiful', 
'paris', 'york', 'lets', 'new', 'boy', 'party']

print (pd.DataFrame({'Unique Words': unique_data}))
   Unique Words
0       refused
1        jumped
2            go
3          roof
4          come
5     beautiful
6         paris
7          york
8          lets
9           new
10          boy
11        party

答案 1 :(得分:1)

这种方法有效:

import pandas as pd
import ast

test = {'Description':["['boy']","['boy', 'jumped', 'roof']","['paris']",\
 "['paris', 'beautiful', 'new', 'york']","['lets', 'go', 'party']",\
 "['refused', 'come', 'party']"]}

tt = pd.DataFrame(test)

listOfWords = []
for i,row in tt.iterrows():
  listOfWords.extend(ast.literal_eval(tt.ix[i,'Description']))
uniqueWords = pd.DataFrame(listOfWords,columns=['Unique Words']).drop_duplicates()

如果你想要它排序:

uniqueWords = uniqueWords.sort_values('Unique Words')

您遍历所有行,将字符串转换为列表,并使用extend将所有这些列表收集到一个长列表中。然后从该列表中创建一个新的DataFrame并删除重复项。

编辑:感谢jezrael纠正我的解决方案,我从他的解决方案中借用了ast.literal_eval方法。

我尝试使用%timeit命令比较我们的解决方案,但在两个解决方案中ValueError: malformed string都获得了ast.literal_eval

EDIT2:jezrael的解决方案速度是我们这里的小数据示例的两倍。

EDIT3:我无法使用大型数据示例(将给定的数字乘以某个数字)进行测试,因为timeit因我不清楚的原因而不断抛出malformed string错误。

EDIT4:以某种方式使它工作。对于更大的数据集(6000行),jezrael的解决方案速度提高了8倍以上。与列表推导相比,即使使用iterrows进行迭代也相当缓慢。我还测试了没有ast的jezrael的第二个解决方案。它的速度是他的第一个解决方案的两倍多。