示例:有如下表需要进行行转列:
代码如下:
# - * -编码:utf - 8 - * 熊猫作为pd导入 进口MySQLdb 从进口filterwarnings警告 #由于创建表如果不是总存在会抛出警告,因此使用filterwarnings消除 filterwarnings(“忽略”,类别=MySQLdb.Warning) 从sqlalchemy进口create_engine 导入系统 如果sys.version_info.major<3: 重载(系统) sys.setdefaultencoding (“utf - 8”) #此脚本适用于python2和python3 主机、端口、用户密码、数据库字符集=?92.168.1.193”,3306年,“狮子”、“mysql”、“测试”、“utf8 " def get_df (): 全球主机、端口、用户、密码、数据库字符集 conn_config={“主机”:主机,“港”:港口,“用户”:用户,“passwd”: passwd,“分贝”:db,“字符集”:字符集} 康涅狄格州=MySQLdb.connect (* * conn_config) result_df=pd。read_sql(“选择用户名,主题,得分从测试”,康涅狄格州) 返回result_df def枢轴(result_df): df_pivoted_init=result_df.pivot(“用户名”、“主题”、“分数”) df_pivoted=df_pivoted_init.reset_index() #将行索引也作为DataFrame值的一部分,以方便存储数据库 返回df_pivoted_init df_pivoted #返回的两个DataFrame,一个是以姓名作索引的,一个是以数字序列作索引,前者用于透视,后者用于save_to_mysql def透视(df_pivoted_init): #透视需要进行df_pivoted_init二维表格的行,列索引遍历,需要拼SQL因此不能使用save_to_mysql存数据,这里使用SQL和MySQLdb接口存 insert_sql="插入test_unpivot(用户名、主题评分)价值观” #处理值为NaN的情况 df_pivoted_init=df_pivoted_init.fillna (0) df_pivoted_init.columns坳的: 在df_pivoted_init.index指数: 值=https://www.yisu.com/zixun/df_pivoted_init.at[指数坳] 如果价值!=0: insert_sql=insert_sql +”(' % s ', ' % s ' % s)”%(索引、坳值)+ ',' insert_sql=insert_sql.strip (" ") 全球主机、端口、用户、密码、数据库字符集 conn_config={“主机”:主机,“港”:港口,“用户”:用户,“passwd”: passwd,“分贝”:db,“字符集”:字符集} 康涅狄格州=MySQLdb.connect (* * conn_config) 坏蛋=conn.cursor () cur.execute(如果不存在“创建表test_unpivot像测试”) cur.execute (insert_sql) conn.commit () conn.close () def save_to_mysql (df_pivoted,表名): 全球主机、端口、用户、密码、数据库字符集 ”“” 只有使用sqllite这样时才能指定反对=连接实例,其他数据库需要使用sqlalchemy生成引擎,引擎的定义可以添加& # 63;来设置字符集和其他属性 ”“” 康涅狄格州=" mysql://% s: % s@ % s: % d/% & # 63; charset=% s " %(用户、密码、主机、端口、db、字符集) mysql_engine=create_engine(康涅狄格州) df_pivoted。to_sql (name=,=mysql_engine监狱,if_exists=叭〈?指数=False) #从测试表读取源数据至DataFrame结构 result_df=get_df () #将源数据行转列为二维表格形式 df_pivoted_init df_pivoted=主(result_df) #将二维表格形式的数据存到新表中进行测试 save_to_mysql (df_pivoted“测试”) #将被行转列的数据透视,存入test_unpivot表中 透视(df_pivoted_init)
结果如下:
关于熊猫DataFrame类自带的主方法:
DataFrame。主(==没有列建立索引没有,值=None):
返回重塑DataFrame由给定的索引/列值。
这里只有3个参数,是因为枢轴之后的结果一定是二维表格,只需要行列及其对应的值,而且也因为是二维表格,透视之后is_pass列是肯定会丢失的,因此一开始我就没查这个列。