最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

pandas.DataFrame中pivot()如何实现行转列的问题(代码)

来源:动视网 责编:小采 时间:2020-11-27 14:11:41
文档

pandas.DataFrame中pivot()如何实现行转列的问题(代码)

pandas.DataFrame中pivot()如何实现行转列的问题(代码):本篇文章给大家带来的内容是关于pandas.DataFrame中pivot()如何实现行转列的问题(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。示例:有如下表需要进行行转列:代码如下:# -*- coding:utf-8 -*- import pand
推荐度:
导读pandas.DataFrame中pivot()如何实现行转列的问题(代码):本篇文章给大家带来的内容是关于pandas.DataFrame中pivot()如何实现行转列的问题(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。示例:有如下表需要进行行转列:代码如下:# -*- coding:utf-8 -*- import pand
 本篇文章给大家带来的内容是关于pandas.DataFrame中pivot()如何实现行转列的问题(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

示例:

有如下表需要进行行转列:

代码如下:

# -*- coding:utf-8 -*-
import pandas as pd
import MySQLdb
from warnings import filterwarnings
# 由于create table if not exists总会抛出warning,因此使用filterwarnings消除
filterwarnings('ignore', category = MySQLdb.Warning)
from sqlalchemy import create_engine
import sys
if sys.version_info.major<3:
 reload(sys)
 sys.setdefaultencoding("utf-8")
 # 此脚本适用于python2和python3
host,port,user,passwd,db,charset="192.168.1.193",3306,"leo","mysql","test","utf8"

def get_df():
 global host,port,user,passwd,db,charset
 conn_config={"host":host, "port":port, "user":user, "passwd":passwd, "db":db,"charset":charset}
 conn = MySQLdb.connect(**conn_config)
 result_df=pd.read_sql('select UserName,Subject,Score from TEST',conn)
 return result_df

def pivot(result_df):
 df_pivoted_init=result_df.pivot('UserName','Subject','Score')
 df_pivoted = df_pivoted_init.reset_index() # 将行索引也作为DataFrame值的一部分,以方便存储数据库
 return df_pivoted_init,df_pivoted
 # 返回的两个DataFrame,一个是以姓名作index的,一个是以数字序列作index,前者用于unpivot,后者用于save_to_mysql

def unpivot(df_pivoted_init):
 # unpivot需要进行df_pivoted_init二维表格的行、列索引遍历,需要拼SQL因此不能使用save_to_mysql存数据,这里使用SQL和MySQLdb接口存
 insert_sql="insert into test_unpivot(UserName,Subject,Score) values "
 # 处理值为NaN的情况
 df_pivoted_init=df_pivoted_init.add(0,fill_value=0)
 for col in df_pivoted_init.columns:
 for index in df_pivoted_init.index:
 value=df_pivoted_init.at[index,col]
 if value!=0:
 insert_sql=insert_sql+"('%s','%s',%s)" %(index,col,value)+','
 insert_sql = insert_sql.strip(',')
 global host, port, user, passwd, db, charset
 conn_config = {"host": host, "port": port, "user": user, "passwd": passwd, "db": db, "charset": charset}
 conn = MySQLdb.connect(**conn_config)
 cur=conn.cursor()
 cur.execute("create table if not exists test_unpivot like TEST")
 cur.execute(insert_sql)
 conn.commit()
 conn.close()

def save_to_mysql(df_pivoted,tablename):
 global host, port, user, passwd, db, charset
 """
 只有使用sqllite时才能指定con=connection实例,其他数据库需要使用sqlalchemy生成engine,engine的定义可以添加?来设置字符集和其他属性
 """
 conn="mysql://%s:%s@%s:%d/%s?charset=%s" %(user,passwd,host,port,db,charset)
 mysql_engine = create_engine(conn)
 df_pivoted.to_sql(name=tablename, con=mysql_engine, if_exists='replace', index=False)

# 从TEST表读取源数据至DataFrame结构
result_df=get_df()
# 将源数据行转列为二维表格形式
df_pivoted_init,df_pivoted=pivot(result_df)
# 将二维表格形式的数据存到新表test中
save_to_mysql(df_pivoted,'test')
# 将被行转列的数据unpivot,存入test_unpivot表中
unpivot(df_pivoted_init)

结果如下:

关于Pandas DataFrame类自带的pivot方法:

DataFrame.pivot(index=None, columns=None, values=None):

Return reshaped DataFrame organized by given index / column values.

这里只有3个参数,是因为pivot之后的结果一定是二维表格,只需要行列及其对应的值,而且也因为是二维表格,unpivot之后is_pass列是肯定会丢失的,因此一开始我就没查这个列。

文档

pandas.DataFrame中pivot()如何实现行转列的问题(代码)

pandas.DataFrame中pivot()如何实现行转列的问题(代码):本篇文章给大家带来的内容是关于pandas.DataFrame中pivot()如何实现行转列的问题(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。示例:有如下表需要进行行转列:代码如下:# -*- coding:utf-8 -*- import pand
推荐度:
标签: 代码 行转列 pandas
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top