Ну, ваш вопрос действительно большой. Я думаю, что вы должны пересмотреть цель сделать это.
На первом шаге каждая строка соответствует друг другу.
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 и df1.
df = df.rename(columns ={'name':'name_x'})
df = pd.merge(df,df1[['name_x','COL1']],on='name_x',how ='left')
Мы можем выглядеть так:
name_x onkey COL1
0 star t-shirt-large-red 1 star t-shirt-
1 star t-shirt-large-blue 1 star t-shirt-
2 star t-shirt-small-red 1 star t-shirt-
3 beautiful rainbow skirt small 1 beautiful rainbow skirt small
4 long maxwell logan jeans- light blue -32L-28W 1 long maxwell logan jeans-
5 long maxwell logan jeans- Dark blue -32L-28W 1 long maxwell logan jeans-
Как видите, мы нашли самое длинное совпадение строк.
Обрабатывает общую строку, и мы разделяем оставшуюся строку.
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