添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Excel、SQL、Python分别实现行列转换

2 年前 · 来自专栏 数据分析之路

目录:

Excel

  • Excel 实现行转列
  • Excel 实现列转行

Python

  • Python 实现行转列
  • Python 实现列转行

SQL

  • MySQL 实现行转列
  • MySQL 实现列转行

一、Excel

Excel 要实现行列转换,需要用到 Power Query,而Power Query 只有Excel 2016以上的版本才有!

1.1 Excel实现行转列

第一步,【Ctrl A 全选数据】-【数据】-【从表格】,创建 Power Query,进入 Power Query界面。

第二步,由于要转换的列,是由"/"分割的,所以我们需要先拆分列。选中需要拆分的列,右键-【拆分列】-【按分隔符】。

第三步,【选择--自定义--】-【输入"/"】-【选择在出现的每个分隔符处】,最后点击【确定】。

第四步,选中第一列,右键-【逆透视其他列】。当然,也可以全选后面的列,选中多列,选择【逆透视】

上一步结果

最后,删除多余的列,关闭并上载,即可完成行转列。

最后实现的结果

1.2 Excel 实现列转行

第一步,【Ctrl A 全选数据】-【数据】-【从表格】,创建 Power Query,进入 Power Query界面。

第二步,添加辅助列。Excel 实现列转换,可以通过【添加辅助列】来实现该效果。而在 Power Query 有多种可以添加辅助列的方法。此处介绍两种方法

法一,通过自定义列,添加辅助列
法二,通过重复列,实现添加辅助列

第三步,进行透视列。【透视列】>【值列,自定义,选中需要透视的列】-【聚合值函数,选择不要聚合】-【确定】。

第四步,合并列。选中透视出来的列,右键,【合并列】-【自定义分隔符】-【确定】 。

最后,选中多余的列,删除!再进行【关闭并上载】。全部搞定!

列转行后的数据

二、Python

2.1 Python 实现行转列

import pandas as pd
df = pd.DataFrame([['夏洛特烦恼','沈腾/马丽/尹正/艾伦/王智'],
                   ['缝纫机乐队','大鹏/乔杉/古力娜扎/李鸿其/韩童生']],
                  columns=['电影名','部分演员'])
print(df)
# 根据'/'拆分为列表
df['部分演员'] = df['部分演员'].str.split("/")      # 转成列表
print(df)
df_new = df.explode('部分演员')
print(df_new)
df.explode 函数:将 dataframe 按照某一指定列进行展开,使得原来的每一行展开成一行或多行。( 注:该列可迭代, 例如list, tuple, set)
最后结果

2.2 Python 实现列转行

列转行,使用 groupby 即可实现!

# 实现 列转行
df_new = df_new.groupby(by='电影名', as_index=False).agg("/".join)
print(df_new)
最后结果打印

三、SQL

先建表,插入测试数据!

-- 建表,插入数据
DROP TABLE IF EXISTS temp;
CREATE TABLE temp ( movie varchar(255), performer varchar(255) );
INSERT INTO temp VALUES ('夏洛特烦恼', '沈腾/马丽/尹正/艾伦/王智'), ('缝纫机乐队', '大鹏/乔杉/古力娜扎/李鸿其/韩童生');
select * from temp;

3.1 MySQL实现行转列

SELECT
	t1.movie,SUBSTRING_INDEX(SUBSTRING_INDEX(t1.performer,'/',t2.help_topic_id+1),'/',-1) AS t_movie
	temp AS t1
INNER JOIN mysql.help_topic AS t2 ON t2.help_topic_id < LENGTH(t1.performer) - LENGTH(
	REPLACE (t1.performer, '/', '')
) + 1

结果如下:

查询结果

3.2 Mysql 实现列转行

用刚刚查询出来的结果我们再创建一个temp2。

CREATE TABLE temp2
SELECT
	t1.movie,SUBSTRING_INDEX(SUBSTRING_INDEX(t1.performer,'/',t2.help_topic_id+1),'/',-1) AS t_movie
	temp AS t1
INNER JOIN mysql.help_topic AS t2 ON t2.help_topic_id < LENGTH(t1.performer) - LENGTH(
	REPLACE (t1.performer, '/', '')
) + 1

查询语句如下:

-- 使用 GROUP_CONCAT() 函数实现 列转行 拼接
SELECT