一个单元格多行扩展(纵向扩展)
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
------------------------