2015-09-06 41 views
0

我的100m左右行,4GB的数据集结果计数,包含两个列表这样的:有条件加入一个的大数据帧

Seed 
a 
r 
apple 
hair 
brush 
tree 

Phrase 
apple tree  
hair brush 

我想要得到的唯一匹配“短语的计数为每个唯一'种子'。例如,种子'a'包含在'苹果树'和'毛刷'中,所以'Phrases_matched_count'应该是'2'。匹配只是使用部分补丁(即'string contains'匹配,不需要是正则表达式或任何复杂的东西)。

Seed Phrases_matched_count 
a  2 
r  2 
apple 1 
hair 1 
brush 1 
tree 1 

我一直试图找到一种方法来做到这一点使用Apache猪(小亚马逊EMR集群上),和Python熊猫(数据集只是在内存的容量),但就是无法找到一种不需要循环遍历每个独特'种子'的每一行的方法,这将花费很长时间,或者是表的交叉乘积,这将使用太多的内存。

任何想法?

回答

0

这可以通过使用内置的contains来完成,但我不确定它在可扩展性上的重要数量的数据。

# Test data 
seed = pd.Series(['a','r', 'apple', 'hair', 'brush', 'tree']) 
phrase = pd.Series(['apple tree', 'hair brush']) 
# Creating a DataFrame with seeds as index and phrases as columns 
df = pd.DataFrame(index=seed, columns=phrase) 
# Checking if each seed is contained in each phrase 
df = df.apply(lambda x: x.index.str.contains(x.name), axis=1) 
# Getting the result 
df.sum(axis=1) 

# The result 
a  2 
r  2 
apple 1 
hair  1 
brush 1 
tree  1 
+0

感谢您的回答,但这并没有解决问题。我并不想在行内计算maches - 我试图计算从每个独特种子到所有可能的独特短语有多少匹配。即,在整个'短语'列中。因此可扩展性的问题。对不起,如果这不明确 - 我已经做了几个编辑试图澄清在原来的文章。 –

+0

没问题。我修改了我的答案,告诉我它是否有帮助。 – Romain

+0

仍然不完全符合我的要求,因为'Seed'和'Phrase'之间的完整匹配尚未完成。我所展示的仅仅是两个清单之间的不完整对应关系。再次,抱歉,如果不清楚 - 我已经编辑了原始帖子,试图让它更清晰,有两个列表,这是一个全能型搜索问题。所有对所有搜索字符串匹配的确是最困难的一步。 –

相关问题