【发布时间】:2021-11-17 14:36:40
【问题描述】:
所以我有这个数据框:
import pandas as pd
d = {'id': [1,1,1,1,2,2,3,3,3,4,4,4,4],
'name':['ada','aad','ada','ada','dddd','fdd','ccc','cccd','ood','aaa','aaa','aar','rrp']
,'amount':[2,-12,12,-12,5,-5,2,3,-5,3,-10,10,-10]}
df1 = pd.DataFrame(d)
df1
id name amount
0 1 ada 2
1 1 aad -12
2 1 ada 12
3 1 ada -12
4 2 dddd 5
5 2 fdd -5
6 3 ccc 2
7 3 cccd 3
8 3 ood -5
9 4 aaa 3
10 4 aaa -10
11 4 aar 10
12 4 rrp -10
首先,我想为每个 id 的负数找到匹配的正数,我通过以下方式完成:
def match_pos_neg(df):
return df[df["amount"].isin(-df["amount"])]
df1 = df1.groupby("id").apply(match_pos_neg).reset_index(0, drop=True)
df1
id name amount
1 1 aad -12
2 1 ada 12
3 1 ada -12
4 2 dddd 5
5 2 fdd -5
10 4 aaa -10
11 4 aar 10
12 4 rrp -10
接下来我要做的是只获取在字符串列“name”中也具有最高相似性的匹配 pos 和 neg 数对。因此,如果一个 id 有两个与正 i 匹配的其他负数想隔离每个 id 相似度最高的对,所以我希望我想要的输出是这样的:
id name amount
2 1 ada 12
3 1 ada -12
4 2 dddd 5
5 2 fdd -5
10 4 aaa -10
11 4 aar 10
我想我必须使用某种类型的字符串相似性索引,如 sequencematcher 或 jaccard 等,但我不知道如何解决这个问题。非常感谢任何有关如何获得我想要的输出的帮助。
【问题讨论】:
-
如果第一行是
1 ada 12需要输出两对 id=1 吗? -
对于 id=1 ,我只需要这一对,因为它具有最高的 str 相似性:
2 1 ada 12 , 3 1 ada -12 -
什么相似度法?提花?您希望输出看起来如何?
-
@Tomer S 是的 jaccard 很好。所需的输出在我的原始帖子(最后一个数据框)上。
标签: python python-3.x pandas string dataframe