pandas 行列转换

pandas 行列转换总结

  1. 一个单元格多行扩展(纵向扩展)

    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   王五  格尔赞
    ------------------------
    
    
  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   王五     迪迦    格尔赞
    -------------------------
    
  3. 列转行(某些列转换为表头)

    # 创建测试数据
    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
    ------------------------
    
  4. 行转列(部分表头转换位一列数据值)

    # 创建测试数据
    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
    ------------------------
    
  5. 多列转两列

    # 创建测试数据
    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
    ------------------------
    

你可能感兴趣的:(数据分析,python)