Python实现一维表与二维表之间的相互转化

对已有数据表进行一维和二维之间的转化:

import pandas as pd

# 读入数据:
df = pd.read_excel('2dims.xls','Sheet1')
df

df的结构为:

如上图所示df是一个二维表。

# 将二维数据表转化为一维数据表:
new_data = df.set_index('地区') # 将df中的地区一列设置为索引列
df1 = new_data.stack()  # stack的返回对象df1是一个二级索引Series对象
df2 = df1.reset_index() # 通过reset_index函数将Series对象的二级索引均转化为DataFrame对象的列值
df2.columns = ['地区','时间','金额']
df2

df2的结构为:

# 将一维数据表转化为二维数据表:
s = pd.Series(list(df2['金额']),index=[df2['地区'],df2['时间']])  # 利用一维数据表df2构造一个二级索引Series对象
df3 = s.unstack() # 对s执行stack的逆操作unstack
df3

df3的结构为:

将SQL语句一维表形式的查询结果转化成二维表形式:

说明:在数据库sql50中有一张学生成绩表grade(sid,cid,score),其中sid表示学生编号,cid表示课程编号,score表示课程成绩。

grade表结构如下图所示:

import pandas as pd
import pymysql

# 定义一个上下文管理器:
class DataBase(object):
    
    def __init__(self,name,password):
        # 创建数据库连接
        self.conn = pymysql.connect('localhost','root',str(password),str(name),charset='utf8')
        # 创建cursor对象
        self.cursor = self.conn.cursor()
        
    def __enter__(self):
        return self.cursor  # 返回cursor对象,且这个cursor对象会被赋给with语句中as后面的变量
    
    def __exit__(self,exc_type,exc_value,traceback):
        self.cursor.close()    # 关闭游标对象
        self.conn.close()      # 断开数据库连接
        
 
def main():
    with DataBase('sql50',883721) as db:
        db.execute('select * from grade')   # 执行sql语句
        content = db.fetchall()  # 获取数据(db中保存着查询结果集)
        df = pd.DataFrame(list(content))  # 将从数据库中查询出的数据放入DataFrame对象中
    return df
    
        
if __name__ == '__main__':
    df = main()

new_cols = ['sid','cid','score']
df.columns = new_cols
df.head()

df部分数据如下图所示:

将一维表形式的查询结果转化成二维表形式:

# 将一维数据表转化为二维数据表:
s = pd.Series(list(df['score']),index=[df['sid'],df['cid']])  # 利用一维数据表df2构造一个二级索引Series对象
new_df = s.unstack() # 对s执行stack的逆操作unstack
new_df

new_df的结构为:

 

参考:

《Python for Data Analysis》2nd Edition

https://blog.csdn.net/qq_41080850/article/details/85100641

PS:本文为博主原创文章,转载请注明出处。

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值