所以我已经在这方面工作了一段时间,但没有任何进展,只是不知道该怎么做。对 pandas 和 python 来说还很陌生。
数据集实际上是 15,000 个产品名称。全部采用不同的格式,有些具有最多 6 个破折号,有些连字符,长度不同,行是带有变体的产品名称。
当我在大型数据集上使用它时,我使用的代码只返回第一个字母,而不是部分字符串。
在我用来测试它的小数据集上工作得很好。
我假设发生这种情况是因为:
- 当它匹配完整的部分字符串时,我尚未创建停止部分
- 因为它尝试匹配单词而不是单个字符,并在发现差异时停止。
在大型数据集上克服这个问题的最佳方法是什么,我错过了什么?或者我必须做这本手册吗?
原始测试数据集
`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`
****************更新********************
- 这是您输入的产品列表,有些有变体,有些没有。
- 搜索重复字符串以确定哪些是带有变体的产品和哪些是不带变体的产品时;什么也没有出现,因为由于变体被添加到字符串末尾,因此它们都被视为唯一值。
所以我想做的是将部分或相似的字符串分组在一起(最长的匹配),提取组内最长的匹配字符串,然后将差异放入其他列中。
如果产品/字符串是唯一的,只需将提取的最长字符串打印到列中。
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/