当前位置:   article > 正文

pandas数据处理_mysql的group_concat与逆向操作。_group_concat反向拆解

group_concat反向拆解

如下,表1(qq_name)与表2(concat_name)使用查询互相转化,表1-表2可以使用group_concat函数实现,表2-表1一时半会我也想不出来,然后想着是否能用python写出来。
表1(qq_name)如下:
在这里插入图片描述
表2(concat_name)如下:
在这里插入图片描述
下面是python处理代码:

import pandas as pd
import pymysql


'''创建mysql数据库连接,这里尝试用的是本地数据库,表1名字为qq_name'''
connect = pymysql.connect(host = 'localhost',user = 'root',password = '123456',database = 'yy',port = 3306,charset = 'utf8')
'''读取qq_name表中的内容,赋值给qq_name变量'''
qq_name = pd.read_sql('select * from qq_name',connect)
#这里我们打印下数据库里这表表看下,效果如上图:表1。
print(qq_name)

'''定义一个group_concat函数:表1-表2转化'''
def group_concat(data):
    return '_'.join(data)
    
'''使用groupby聚合,apply传入自定义函数,即可得到concat_name表'''
concat_name = qq_name.groupby('qq')['name'].apply(group_concat).reset_index(drop=False) 
#我们打印下concat_name看下,效果如上图:表2。
print(concat_name)

'''定义一个函数,实现concat_name转化为qq_name'''
def restore_qq_name(df):
    columns=['qq','name']
    '''创建一个DataFrame,即我们需要还原的qq_name'''
    qq_name = pd.DataFrame(columns=columns)
    '''遍历索引'''
    for each in df.index:
    	'''切分group_concat的字段,返回一个列表'''
        name_list = df.loc[each,'name'].split('_')
        '''遍历name_list,然后逐条数据添加到qq_name'''
        for name in name_list:
            qq_name = qq_name.append(pd.DataFrame([[df.loc[each,'qq'],name]],columns=columns))
    return qq_name
    
'''调用函数输出qq_name,重置下索引。'''
qq_name = restore_qq_name(concat_name).reset_index(drop=True)
#打印下qq_name看下,效果如上:表1.
print(qq_name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

mysql查询语句:表1-表2

select qq, group_concat(name separator"_") name from qq_name group by qq;
  • 1

表1-表2

有兴趣试试的同学,创表语句这里也给大家写好了:

# 创建表1:qq_name
create table qq_name(qq int, name varchar(10));
insert into qq_name values(123,"a"),(123,"b"),(123,"c"),(234,"f"),(234,"g");

# 创建表2:concat_name
create table concat_name select qq, group_concat(name separator"_") name from qq_name group by qq;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

表2-表1的查询语句(不用存储过程),mysql大家知道怎么写的话,欢迎留言,先表以感谢~

逆向查询,hive中可以通过lateral view 与 explode函数实现

select qq,subview.view_name
from concat_name 
-- subview是虚拟视图名称,view_name是虚拟字段名称,必须要加上;
lateral view explode(split(name,'_')) subview as view_name
  • 1
  • 2
  • 3
  • 4
  • explode函数可以将一个array或者map展开,
    • 其中explode(array)使得结果中将array列表里的每个元素生成一行;
    • explode(map)使得结果中将map里的每一对元素作为一行,key为一列,value为一列;
    • explode只能拆分单个字段
  • lateral view explode 相当于一个拆分location字段的虚表,然后与原表进行关联
select explode(split(name,"_")) from concat_name   -- 返回一列五行数据,值分别为a,b,c,f,g
select qq,explode(split(name,"_")) from concat_name   -- 会报错
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/74964
推荐阅读
相关标签
  

闽ICP备14008679号