背景:一张表中有一列取值是由某个分隔符连接成的多个字符串,目标是将这一长行拆分成多行,存储到一个新的字段中。
Python操作
方法一
df=df.drop('cont', axis=1).join(df['cont'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('tag'))
方法二
df=df['cont'].str.split(',', expand=True).stack().reset_index(level=0).set_index('level_0').rename(columns={0:'tag'}).join(df.drop('cont', axis=1))
MySQL操作
-- 需要依赖 mysql.help_topic 表
SELECT
a.uid,a.tid,SUBSTRING_INDEX( SUBSTRING_INDEX( a.`cont`, ',', b.help_topic_id + 1 ), ',',-1 ) tag
FROM
test a
JOIN mysql.help_topic b ON b.help_topic_id < ( LENGTH( a.`cont`) - LENGTH( REPLACE ( a.`cont`, ',', '' ) ) + 1 );
/*
1、mysql.help_topic 的作用是对 SUBSTRING_INDEX 函数出来的数据(也就是按照分割符分割出来的)数据连接起来做笛卡尔积。
2、replace函数字符串替换函数。select REPLACE ( a.`cont`, ',', '' ) 将字段值中,替换为空字符串
select ( LENGTH( a.`cont`) - LENGTH( REPLACE ( a.`cont`, ',', '' ) ) 获取逗号的个数
3、SUBSTRING_INDEX 是字符串截取函数
SUBSTRING_INDEX(str, delim, count)
str : 表示需要拆分的字符串
delim : 表示分隔符,通过某字符进行拆分
count : 当 count 为正数,取第 n 个分隔符之前的所有字符;当 count 为负数,取倒数第 n 个分隔符之后的所有字符。
SUBSTRING_INDEX(SUBSTRING_INDEX(a.cont, ',', b.help_topic_id), ',',-1 ) 就是获取 tmp_help_topic 表的 help_topic_id 字段的值作为 cont 字段的第几个子串