Python 如何获取熊猫中单词的两行重叠度

Python 如何获取熊猫中单词的两行重叠度,python,pandas,Python,Pandas,我有一个如下所示的数据框: df = pd.DataFrame([{"id": 'A1', 'happy_words': 'a,b,d,e', 'sad_words':'aa,cc,mm,zz'}, {"id": 'A2', 'happy_words': 'f,g,d,e', 'sad_words':'aa,dd,mm,zz'}, {"id&q

我有一个如下所示的数据框:

df = pd.DataFrame([{"id": 'A1', 'happy_words': 'a,b,d,e', 'sad_words':'aa,cc,mm,zz'},
                          {"id": 'A2', 'happy_words': 'f,g,d,e', 'sad_words':'aa,dd,mm,zz'},
                          {"id": 'B2', 'happy_words': 'a,d,m,e', 'sad_words':'tt,cc,uu,zz'}])

我想计算每对(I,j)之间使用的单词的重叠程度。例如,4个单词中的2个--“d,e”由A1和A2选择,这两个单词被视为重叠。用于计算两个响应向量之间重叠程度的代码为

def get_percent_agree(i, j):
    return (list(i-j).count(0))/len(i)

如何应用上面的代码获得最终的二元数据帧

i    j  overlap_happy   overlap_sad
0    1    x%             x%  
0    2    x%             x%
0    3    x%             x%  
1    2    x%             x%  
2    3    x%             x%  

让我们试试这样的方法:

重新导入
从itertools导入组合
将numpy作为np导入
作为pd进口熊猫
df=pd.DataFrame([{“id”:'A1','happy_words':'a,b,d,e','sad_words':'aa,cc,mm,zz'},
{“id”:“A2”,“高兴的词”:“f,g,d,e”,“悲伤的词”:“aa,dd,mm,zz”},
{“id”:“B2”,“高兴的词”:“a,d,m,e”,“悲伤的词”:“tt,cc,uu,zz”})
words\u cols=list(过滤器(重新编译(r'.*\u words$).search,df.columns))
df[words\u cols]=df[words\u cols].apply(lambda c:c.str.split(','))
#获取所有行组合
a、 b=地图(列表,zip(*组合(df.index,2)))
#合并
df=df.loc[a]。重置索引()。合并(
df.loc[b].重置索引(),
左索引=真,
右索引=真,
).rename(列={'index_x':'i','index_y':'j'})
def获得百分比的同意:
#获得交叉点
happy_intersect=np.intersect1d(s['happy_words_x'],s['happy_words_y']))
sad_intersect=np.intersect1d(s['sad_words_x'],s['sad_words_y']))
#计算和格式百分比
返回pd.序列([f'{len(happy_intersect)/len(s.happy_words_x):.2%}),
f'{len(sad_intersect)/len(s.sad_words_x):.2%}'],
索引=['overlap_happy',
"重叠(u sad")
#归并
df=df[['i','j']]。合并(
df.应用(获得百分比,轴=1),
左索引=真,
右索引=真
)
#展示
打印(df.to_字符串(索引=False))
输出:

i j overlap_happy overlap_sad 0 1 50.00% 75.00% 0 2 75.00% 50.00% 1 2 50.00% 25.00% 我重叠你快乐重叠你悲伤 0 1 50.00% 75.00% 0 2 75.00% 50.00% 1 2 50.00% 25.00%
它们是否需要处于相同的位置才能被视为重叠?“a,b”和“b,a”重叠吗?不,它们没有重叠。谢谢