python - 大数据集上的部分字符串匹配

标签 python pandas difflib fuzzywuzzy

所以我已经在这方面工作了一段时间,但没有任何进展,只是不知道该怎么做。对 pandas 和 python 来说还很陌生。

数据集实际上是 15,000 个产品名称。全部采用不同的格式,有些具有最多 6 个破折号,有些连字符,长度不同,行是带有变体的产品名称。

当我在大型数据集上使用它时,我使用的代码只返回第一个字母,而不是部分字符串。

在我用来测试它的小数据集上工作得很好。

我假设发生这种情况是因为:

  1. 当它匹配完整的部分字符串时,我尚未创建停止部分
  2. 因为它尝试匹配单词而不是单个字符,并在发现差异时停止。

大型数据集上克服这个问题的最佳方法是什么,我错过了什么?或者我必须做这本手册吗?

原始测试数据集

`1.star t-shirt-large-red
 2.star t-shirt-large-blue
 3.star t-shirt-small-red
 4.beautiful rainbow skirt small
 5.long maxwell logan jeans- light blue -32L-28W
 6.long maxwell logan jeans- Dark blue -32L-28W`

所需的数据集/输出:

 `COL1                             COL2         COL3    COL4
  1[star t-shirt]                  [large]      [red]    NONE
  2[star t-shirt]                  [large]      [blue]   NONE
  3[star t-shirt]                  [small]      [red]    NONE
  4[beautiful rainbow skirt small] [small]       NONE   NONE
  5[long maxwell logan jeans]      [light blue] [32L]  [28W]
  6[long maxwell logan jeans]      [Dark blue]  [32L]  [28W]`

这是我在上一个问题中得到帮助的代码:

`df['onkey'] = 1
 df1 = pd.merge(df[['name','onkey']],df[['name','onkey']], on='onkey')
 df1['list'] = df1.apply(lambda x:[x.name_x,x.name_y],axis=1)
 from os.path import commonprefix
 df1['COL1'] = df1['list'].apply(lambda x:commonprefix(x))
 df1['COL1_num'] = df1['COL1'].apply(lambda x:len(x))
 df1 = df1[(df1['COL1_num']!=0)]
 df1 = df1.loc[df1.groupby('name_x')['COL1_num'].idxmin()]
 df = df.rename(columns ={'name':'name_x'})
 df = pd.merge(df,df1[['name_x','COL1']],on='name_x',how ='left')`


`df['len'] = df['COL1'].apply(lambda x: len(x))
 df['other'] = df.apply(lambda x: x.name_x[x.len:],axis=1)
 df['COL1'] = df['COL1'].apply(lambda x: x.strip())
 df['COL1'] = df['COL1'].apply(lambda x: x[:-1] if x[-1]=='-' else x)
 df['other'] = df['other'].apply(lambda x:x.split('-'))
 df = df[['COL1','other']]
 df = pd.concat([df['COL1'],df['other'].apply(pd.Series)],axis=1)`

`                                      COL1            0     1    2
0                   star t-shirt        large   red  NaN
1                   star t-shirt        large  blue  NaN
2                   star t-shirt        small   red  NaN
3  beautiful rainbow skirt small                NaN  NaN
4       long maxwell logan jeans  light blue    32L  28W
5       long maxwell logan jeans   Dark blue    32L  28W`

****************更新********************

  1. 这是您输入的产品列表,有些有变体,有些没有。
  2. 搜索重复字符串以确定哪些是带有变体的产品和哪些是不带变体的产品时;什么也没有出现,因为由于变体被添加到字符串末尾,因此它们都被视为唯一值。
  3. 所以我想做的是将部分或相似的字符串分组在一起(最长的匹配),提取组内最长的匹配字符串,然后将差异放入其他列中。

  4. 如果产品/字符串是唯一的,只需将提取的最长字符串打印到列中。

    star t-shirt-large-red star t-shirt-large-blue star t-shirt-small-red beautiful rainbow skirt small long maxwell logan jeans- light blue -32L-28W long maxwell logan jeans- Dark blue -32L-28W Organic and natural candy - 3 Pack - Mint Organic and natural candy - 3 Pack - Vanilla Organic and natural candy - 3 Pack - Strawberry Organic and natural candy - 3 Pack - Chocolate Organic and natural candy - 3 Pack - Banana Organic and natural candy - 3 Pack - Cola Organic and natural candy - 12 Pack Assorted Morgan T-shirt Company - Small/Medium-Blue Morgan T-shirt Company - Medium/Large-Blue Morgan T-shirt Company - Medium/Large-red Morgan T-shirt Company - Small/Medium-Red Morgan T-shirt Company - Small/Medium-Green Morgan T-shirt Company - Medium/Large-Green Nelly dress leopard small

    col1 col2 col3 col4 star t-shirt large red<br/> star t-shirt large blue<br/> star t-shirt small red<br/> beautiful rainbow skirt small<br/> Long maxwell logan jeans light blue 32L 28W Long maxwell logan jeans Dark blue 32L 28W Organic and natural candy 3 Pack Mint Organic and natural candy 3 Pack Vanilla<br/> Organic and natural candy 3 Pack Strawberry<br/> Organic and natural candy 3 Pack Chocolate<br/> Organic and natural candy 3 Pack Banana<br/> Organic and natural candy 3 Pack Cola Organic and natural candy 12 Pack Assorted Morgan T-shirt Company Small/Medium Blue Morgan T-shirt Company Medium/Large Blue Morgan T-shirt Company Medium/Large Red<br/> Morgan T-shirt Company Small/Medium Red<br/> Morgan T-shirt Company Small/Medium Green<br/> Morgan T-shirt Company Medium/Large Green<br/> Nelly dress Leopard Small<br/> Bijoux<br/> Princess PJ-set<br/> Lemon tank top Yellow Medium

最佳答案

构建 DataFrame df 如下:

df = pd.DataFrame()
df = df.append(['1.star t-shirt-large-red'])
df = df.append(['2.star t-shirt-large-blue'])
df = df.append(['4.beautiful rainbow skirt small'])
df = df.append(['5.long maxwell logan jeans- light blue -32L-28W'])
df = df.append(['6.long maxwell logan jeans- Dark blue -32L-28W'])

df.columns = ['Product']

以下代码

(a) 去除所有空格,

(b) 按句点 ('.') 分割并获取后面的内容,

(c) 由于需要进一步操作,将 't-shirt' 替换为 'tshirt'(如果需要,可以在操作后将其改回来)

(d) 再次用“-”分割并扩展以给出您的数据框。

df['Product'].str.strip().str.split('.').str.get(1).str.replace('t-shirt', 'tshirt').str.split('-', expand = True)

输出:

                               0             1     2     3
0                    star tshirt         large   red  None
0                    star tshirt         large  blue  None
0  beautiful rainbow skirt small          None  None  None
0       long maxwell logan jeans   light blue    32L   28W
0       long maxwell logan jeans    Dark blue    32L   28W

鉴于您的产品命名不一致,将会遗漏一些边缘情况(例如:美丽的彩虹裙小)。你可能需要再次把它们捞出来。

关于python - 大数据集上的部分字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52267034/

相关文章:

python - 派生自 wx.Dialog 的通用 MessageBox

python - HTML 表格到 Pandas 表格 : Info inside html tags

python - Pandas dataframe If else 逻辑 AND 涉及两列

python - Pandas 数据框中值的组合

python - 通过 difflib 模块比较 python 中的列表

python - 比较csv的两列并在另一个csv中输出字符串相似度

python - 使用列表作为列中的数据类型(SQLAlchemy)

python - <Python> for 循环中的两个迭代变量

python - 如何从 dtype 为列表的 Pandas 系列中删除 NaN?

python - 对出现次数最多的 Python 的唯一值进行分组