为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 列出两列之间的相似性

Pandas 列出两列之间的相似性

肥皂起泡泡 2022-06-02 10:10:51
我有一个df:df = pd.DataFrame({'id': [123, 456, 789],                   'list_left': [['dog', 'cat'],['dog', 'mouse'], ['dog', 'elephant']],                   'list_right': [['cat', 'mouse', 'giraffe'], ['mouse', 'dog'], ['giraffe', 'gorilla']]})我想找到字符串列表之间的相似性。这应该忽略顺序或长度(即['dog', 'mouse'],['mouse', 'dog']应该导致 100% 的相似性)。这是我的尝试(https://www.geeksforgeeks.org/python-percentage-similarity-of-lists/):df['result'] = len(set(df['list_left']) & set(df2['list_right'][1])) / float(len(set(df['list_left']) | set(df['list_right']))) * 100这会导致此错误:TypeError                                 Traceback (most recent call last)<ipython-input-136-3b1e1ee16eed> in <module>()----> 1 df['new'] = len(set(df['list_left']) & set(df2['list_right'][1])) / float(len(set(df['list_left']) | set(df['list_right']))) * 100TypeError: unhashable type: 'list'与熊猫 df 中的列表列进行比较的好方法是什么?对于不同长度的字符串列表,列表之间的相似性是否具有逻辑意义?
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

解决方案是使用apply:


df.apply(lambda x: len(set(x['list_left']) & set(x['list_right'])) / float(len(set(x['list_left']) | set(x['list_right']))) * 100,1)

输出:


0     25.0

1    100.0

2      0.0

dtype: float64

方程的解释:


首先在等式中检查公共元素:


df.apply(lambda x: len(set(x['list_left']) & set(x['list_right'])), 1)


输出:


0    1

1    2

2    0

dtype: int64

接下来,您检查列表的不同元素并将其乘以:


df.apply(lambda x: float(len(set(x['list_left']) | set(x['list_right']))), 1)

输出:


0    4

1    2

2    4

dtype: float64

相似度由(共同元素/不同元素)*100 定义。所以对于第一行它是1/4*100 = 0.25。


查看完整回答
反对 回复 2022-06-02
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

这里解决方案不使用apply


s = df.list_left + df.list_right

s1 = s.map(set)

(s.str.len() - s1.str.len()) / s1.str.len() * 100


Out[132]:

0     25.0

1    100.0

2      0.0

dtype: float64


查看完整回答
反对 回复 2022-06-02
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号