微信群解答_行列转换的Mysql,Excel,Python解法

微信群又双叕有新问题了,如图所示,两个表格的转换。
微信群解答_行列转换的Mysql,Excel,Python解法_第1张图片
首先跟大家分享一下我的记忆口诀:

  1. 行转列逆透视
  2. 列转行透视

我们用Excel、Python、SQL分别实现一下上图的要求。

Excel

使用到Excel中的Power Query,只有Excel2016以上的版本才有,注意版本号。

行转列

  1. 全选数据>数据选项卡>自表格/区域
    微信群解答_行列转换的Mysql,Excel,Python解法_第2张图片
  2. 由于要转换的列是由"/"分割的,所以我们需要先拆分列。选中需要拆分的列>右键>拆分列>按分隔符。
    微信群解答_行列转换的Mysql,Excel,Python解法_第3张图片
  3. 选择自定义>输入"/">选择每次出现分隔符时>确定
    微信群解答_行列转换的Mysql,Excel,Python解法_第4张图片
  4. 选中标题行>右键>逆透视其他列

    也可以多选中值列选择逆透视

微信群解答_行列转换的Mysql,Excel,Python解法_第5张图片
5. 删除多于列>关闭并上载,完成
微信群解答_行列转换的Mysql,Excel,Python解法_第6张图片

列转行

这边暂且只想到添加辅助列来实现该效果,有更好的方法欢迎在评论区留言。

  1. 同样多选进入Power Query界面

  2. 添加列>自定义列>输入"=[值]">确定

    相当于是复制一列值,列名自定义,自定义公式内的值根据原表列名来。

    微信群解答_行列转换的Mysql,Excel,Python解法_第7张图片

  3. 选中“值”>透视列>“值列”选择自定义>聚合值函数选择不要聚合>确定

    第一步也可以选择“自定义”列,如果这样操作的话,在第三步就要选择"值",这里列名没有起好,请大家看清楚。

    微信群解答_行列转换的Mysql,Excel,Python解法_第8张图片

  4. 选中透视出来的列>右键>合并列>自定义分隔符>确定
    微信群解答_行列转换的Mysql,Excel,Python解法_第9张图片

  5. 选中合并后的列>右键>替换值>要查找的列输入"//">确定>关闭并上载
    微信群解答_行列转换的Mysql,Excel,Python解法_第10张图片

  6. 完成
    在这里插入图片描述

Python

行转列

import pandas as pd

df = pd.DataFrame([['流浪地球', '科幻/冒险/灾难'], ['唐山大地震', '剧情/亲情/灾难']],
                  columns=['name', 'type'])
df

在这里插入图片描述

# 根据'/'拆分为列表
df['type'] = df.type.str.split("/")

df_new = df.explode('type')
df_new

微信群解答_行列转换的Mysql,Excel,Python解法_第11张图片

列转行

df_new.groupby(by='name', as_index=False).agg("/".join)

在这里插入图片描述

explode()函数在pandas0.25.0之后才支持,除了这个方法俺想不到别的方法了。

SQL

行转列

-- 建表,插入数据
DROP TABLE IF EXISTS temp;
CREATE TABLE temp ( name varchar(10), type varchar(20) );
INSERT INTO temp VALUES ('流浪地球', '科幻/冒险/灾难'), ('唐山大地震', '剧情/亲情/灾难');

select * from temp;

在这里插入图片描述

SELECT a.name
	, substring_index(substring_index(a.type, '/', b.help_topic_id + 1), '/', -1) AS type
FROM temp a
	JOIN mysql.help_topic b ON b.help_topic_id < length(a.type) - length(replace(a.type, '/', '')) + 1

微信群解答_行列转换的Mysql,Excel,Python解法_第12张图片

列转行

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

DROP TABLE IF EXISTS temp2;
CREATE TABLE temp2
(SELECT a.name , substring_index(substring_index(a.type, '/', b.help_topic_id + 1), '/', -1) AS type FROM temp a JOIN mysql.help_topic b ON b.help_topic_id < length(a.type) - length(replace(a.type, '/', '')) + 1);

-- 使用group_concat函数实现列转行拼接
SELECT name, GROUP_CONCAT(type SEPARATOR '/') AS type
FROM temp2
GROUP BY name;

在这里插入图片描述

你可能感兴趣的:(微信群解答,excel,python,mysql,行列转换)