pandas 行列转换总结
一个单元格多行扩展(纵向扩展)
import pandas as pd # 创建测试数据 test_data = pd.DataFrame({'name':['张三','李四','王五'],'love':['刘亦菲,陈奕迅','汪峰,周杰伦','迪迦,大谷,格尔赞']}) print(f'转换前:\n{test_data}',end='\n------------------------\n') # 转换代码 test_data['love'] = test_data['love'].str.split(',') test_data = test_data.explode('love') print(f'转换后: \n{test_data}',end='\n------------------------\n') 转换前: name love 0 张三 刘亦菲,陈奕迅 1 李四 汪峰,周杰伦 2 王五 迪迦,大谷,格尔赞 ------------------------ 转换后: name love 0 张三 刘亦菲 0 张三 陈奕迅 1 李四 汪峰 1 李四 周杰伦 2 王五 迪迦 2 王五 大谷 2 王五 格尔赞 ------------------------
一个单元格多列扩展(横向扩展)
# 创建测试数据 test_data = pd.DataFrame({'name':['张三','李四','王五'],'love':['刘亦菲,陈奕迅','汪峰,周杰伦','迪迦,格尔赞']}) print(f'转换前:\n{test_data}',end='\n------------------------\n') # 转换代码 test_data[['love_1','love_2']] = test_data['love'].str.split(',',expand=True) test_data.drop(columns='love',inplace=True) print(f'转换后: \n{test_data}',end='\n------------------------\n') 转换前: name love 0 张三 刘亦菲,陈奕迅 1 李四 汪峰,周杰伦 2 王五 迪迦,格尔赞 ------------------------ 转换后: name love_1 love_2 0 张三 刘亦菲 陈奕迅 1 李四 汪峰 周杰伦 2 王五 迪迦 格尔赞 -------------------------
列转行(某些列转换为表头)
# 创建测试数据 test_data = pd.DataFrame({'name':['张三','张三','李四','李四','王五','王五'] ,'course':['数学','语文','数学','语文','数学','语文'] ,'score':[86,34,56,78,87,95]}) print(f'转换前:\n{test_data}',end='\n------------------------\n') # 转换代码 test_data = pd.pivot(data=test_data # 待转换df ,index='name' # df交叉后行 ,columns='course' # df交叉后的列 ,values='score' # df交叉后数据(不发生聚合) ) test_data.reset_index(inplace=True) print(f'转换后: \n{test_data}',end='\n------------------------\n') 转换前: name course score 0 张三 数学 86 1 张三 语文 34 2 李四 数学 56 3 李四 语文 78 4 王五 数学 87 5 王五 语文 95 ------------------------ 转换后: course name 数学 语文 0 张三 86 34 1 李四 56 78 2 王五 87 95 ------------------------
行转列(部分表头转换位一列数据值)
# 创建测试数据 test_data = pd.DataFrame({'name':['张三','李四','王五'] ,'数学':[86,56,87] ,'语文':[34,78,95] }) print(f'转换前:\n{test_data}',end='\n------------------------\n') # 转换代码 test_data = pd.melt(frame=test_data # 待转换df ,id_vars='name' # 固定的列 ,value_vars=['数学','语文'] # 待转换的列名 ,var_name='course' # 行转列转换后的列名称 ,value_name='score' # 最后数据列名称 ) # test_data.reset_index(inplace=True) print(f'转换后: \n{test_data}',end='\n------------------------\n') 转换前: name 数学 语文 0 张三 86 34 1 李四 56 78 2 王五 87 95 ------------------------ 转换后: name course score 0 张三 数学 86 1 李四 数学 56 2 王五 数学 87 3 张三 语文 34 4 李四 语文 78 5 王五 语文 95 ------------------------
多列转两列
# 创建测试数据 test_data = pd.DataFrame({'name':['张三','李四','王五'] ,'科目1':['数学','数学','数学'] ,'科目1分数':[34,78,95] ,'科目2':['语文','语文','语文'] ,'科目2分数':[86,56,87] }) print(f'转换前:\n{test_data}',end='\n------------------------\n') # 转换代码 test_data = pd.lreshape(data=test_data # 待转换数据 ,groups={'科目':['科目1','科目2'],'分数':['科目1分数','科目2分数']} ,dropna=False # 是否删除空值 ) print(f'转换后: \n{test_data}',end='\n------------------------\n') 转换前: name 科目1 科目1分数 科目2 科目2分数 0 张三 数学 34 语文 86 1 李四 数学 78 语文 56 2 王五 数学 95 语文 87 ------------------------ 转换后: name 科目 分数 0 张三 数学 34 1 李四 数学 78 2 王五 数学 95 3 张三 语文 86 4 李四 语文 56 5 王五 语文 87 ------------------------