如何将 pandas 数据框中的字符串拆分为双字母组,然后再分解成新行?
How to split a string in a pandas dataframe into bigrams that can then exploded into new rows?
我有一个姓名记录数据库,我正在尝试为其创建二元组并将二元组转换为数据框中的新行。我这样做的原因是因为有些记录包含多个名称,而且有些记录可能对同一名称有不同的顺序。我的最终目标是寻找重复项并为每个独特的个体创建一个最终记录。我计划在这个结果上使用 TF-IDF 和余弦相似度。下面是我正在尝试做的一个例子。
当前:
目标:
bigrams = [[id, ' '.join(b)] for id, l in zip(df['ID'].tolist(), df['Name'].tolist()) for b in zip(l.split(" ")[:-1], l.split(" ")[1:])]
bigrams_df = pd.DataFrame(bigrams, columns = ['ID','Name'])
尝试使用 zip
、apply
和 explode
:
df.Name = df.Name.str.split()
df.Name.apply(lambda x: tuple(zip(x,x[1:]))).explode().map(lambda x: f"{x[0]} {x[1]}")
或
使用列表理解:
df2 = pd.Series([ f"{a} {b}" for val in df.Name for (a,b) in (zip(val,val[1:]))])
0 John Doe
1 John Doe
1 Doe Mike
1 Mike Smith
2 John Doe
2 Doe Mike
2 Mike Smith
2 Smith Steve
2 Steve Johnson
3 Smith Mike
3 Mike J.
3 J. Doe
3 Doe Johnson
3 Johnson Steve
4 Steve J.
4 J. M
4 M Smith
Name: Name, dtype: object
编辑:
第二部分:
df2 = pd.DataFrame([ [idx+1, f"{a} {b}"] for idx,val in enumerate(df.Name) for (a,b) in (zip(val,val[1:]))], columns=['ID', 'Names'])
我有一个姓名记录数据库,我正在尝试为其创建二元组并将二元组转换为数据框中的新行。我这样做的原因是因为有些记录包含多个名称,而且有些记录可能对同一名称有不同的顺序。我的最终目标是寻找重复项并为每个独特的个体创建一个最终记录。我计划在这个结果上使用 TF-IDF 和余弦相似度。下面是我正在尝试做的一个例子。
当前:
目标:
bigrams = [[id, ' '.join(b)] for id, l in zip(df['ID'].tolist(), df['Name'].tolist()) for b in zip(l.split(" ")[:-1], l.split(" ")[1:])]
bigrams_df = pd.DataFrame(bigrams, columns = ['ID','Name'])
尝试使用 zip
、apply
和 explode
:
df.Name = df.Name.str.split()
df.Name.apply(lambda x: tuple(zip(x,x[1:]))).explode().map(lambda x: f"{x[0]} {x[1]}")
或
使用列表理解:
df2 = pd.Series([ f"{a} {b}" for val in df.Name for (a,b) in (zip(val,val[1:]))])
0 John Doe
1 John Doe
1 Doe Mike
1 Mike Smith
2 John Doe
2 Doe Mike
2 Mike Smith
2 Smith Steve
2 Steve Johnson
3 Smith Mike
3 Mike J.
3 J. Doe
3 Doe Johnson
3 Johnson Steve
4 Steve J.
4 J. M
4 M Smith
Name: Name, dtype: object
编辑:
第二部分:
df2 = pd.DataFrame([ [idx+1, f"{a} {b}"] for idx,val in enumerate(df.Name) for (a,b) in (zip(val,val[1:]))], columns=['ID', 'Names'])