所以我已经做了一段时间了,只是不知道该做什么做。公平熊猫和Python是新手。在
数据集实际上是15000个产品名称。所有的格式都不同,有的有多个破折号,最多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`
所需数据集/输出:
^{pr2}$下面是我在前一个问题中得到帮助的代码:
`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`
*************更新*************
所以我想做的是将部分或相似的字符串组合在一起(最长的匹配),提取组中最长的匹配字符串,然后将差异放入其他列中。在
如果product/string是唯一的,只需将其打印到具有提取的最长字符串的列中。在
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
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
Bijoux
Princess PJ-set
Lemon tank top Yellow Medium
构造一个数据帧df,如下所示:
以下代码
(a)去掉所有空白
(b)按句点('.')拆分并获取后面的内容
(c)由于进一步的操作,将“t恤”替换为“t恤”(如果您想在手术后将其改回原处)
(d)用“-”再次拆分并展开以提供数据帧。在
^{pr2}$输出:
考虑到您的产品在命名上的不一致性,会遗漏一些边缘案例(例如:
beautiful rainbow skirt small
)。你可能得再把它们捞出来。在一个简单易懂、调试和灵活扩展的解决方案如下:
考虑一下您的初始产品名保存在一个名为
strings
的列表中。在然后,解决方案如下:
其中,我们将解析函数
^{pr2}$make_row
定义为:定义
cols
的第一行也可以是简单的cols = string.split('-')
,在这种情况下,您可以使用以下命令进行格式化:现在在您的例子中,我看到您的一些产品名称中有一个连字符,在这种情况下,您可能需要提前对它们进行“清理”(或者在
make_row
内,如您所愿),使用类似于:示例输入:
输出:
问题数据的输出(在更正第4项的错误之后):
编辑:
如果您还想将项目“分组”,则可以:
a)在获得如上所述的数据帧之后,在列COL1上使用
sort_values
(pandas doc),以简单地逐个显示同一产品对应的行,或者b)使用
group_by
来实际获得如下分组的数据帧:这样可以让每个组都这样:
产生以下输出:
相关问题 更多 >
编程相关推荐