我有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数据帧。
答案 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的第二个解决方案。它的速度是他的第一个解决方案的两倍多。