pandas数据处理_mysql的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)

mysql查询语句:表1-表2

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

表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;

表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
  • 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   -- 会报错
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值