比较两个数据框列以匹配字符串或子字符串,然后以pandas计数(需要快速版)



我有两个数据帧(A和B)。我想比较A中的字符串并找到匹配或包含在B中的另一个字符串中。然后计算A匹配或包含在B中的次数。

Dataframe A

0   "4012, 4065, 4682"
1   "4712, 2339, 5652, 10007"
2   "4618, 8987"
3   "7447, 4615, 4012"
4   "6515"
5   "4065, 2339, 4012"

Dataframe B
0   "6515, 4012, 4618, 8987"         <- matches (DF A, Index 2 & 4) (2: 4618, 8987), (4: 6515)
1   "4065, 5116, 2339, 8757, 4012"   <- matches (DF A, Index 5) (4065, 2339, 4012)
2   "1101"
3   "6515"                           <- matches (DF A, Index 4) (6515)
4   "4012, 4615, 7447"               <- matches (DF A, Index 3) (7447, 4615, 4012)
5   "7447, 6515, 4012, 4615"         <- matches (DF A, Index 3 & 4) (3: 7447, 4615, 4012 ), (4: 6515)

Desired Output:
Itemset             Count
2   4618, 8987            1
3   7447, 4165, 4012      2
4   6515                  3
5   4065, 2339, 4012      1

基本上,我想计数当a在B中直接匹配时(无论是否有序),或者如果a部分包含在B中(无论是否有序)。我的目标是计算A被b验证了多少次,这些都是字符串。

EDIT需要快速编辑:这是我以前的帖子里的一个重做问题:比较两个数据框列以匹配字符串或子字符串,然后计数为pandas

我在dfA和dfB中都有数百万行来进行这些比较。在我之前的文章中,下面的代码完成了工作:

import pandas as pd
dfA = pd.DataFrame(["4012, 4065, 4682",
"4712, 2339, 5652, 10007",
"4618, 8987",
"7447, 4615, 4012",
"6515",
"4065, 2339, 4012",],
columns=['values'])
dfB = pd.DataFrame(["6515, 4012, 4618, 8987",
"4065, 5116, 2339, 8757, 4012",
"1101",
"6515",
"4012, 4615, 7447",
"7447, 6515, 4012, 4615"],
columns=['values'])
dfA['values_list'] = dfA['values'].str.split(', ')
dfB['values_list'] = dfB['values'].str.split(', ')

dfA['overlap_A'] = [sum(all(val in cell for val in row)
for cell in dfB['values_list']) 
for row in dfA['values_list']]

然而,对于要检查的行总数,我遇到了性能问题,需要另一种方法来检查频率/计数。看来这个案子需要Numpy。这就是我的知识水平,因为我主要研究的是熊猫。有人有什么建议让这个更快吗?

dfA_array = dfA['values_list'].to_numpy()
dfB_array = dfB['values_list'].to_numpy()

试一试。你的算法是O(NNK): count的平方*每行单词。以下应改善到0 (NK)

from collections import defaultdict
from functools import reduce
d=defaultdict(set)
for i,t in enumerate(dfB['values']):
for s in t.split(', '):
d[s].add(i)
dfA['count']=dfA['values'].apply(lambda x:len(reduce(lambda a,b: a.intersection(b), [d[s] for s in x.split(', ') ])))

最新更新