python行转列_pandas.DataFrame中pivot()如何实现行转列的问题(代码)
本篇文章給大家帶來的內容是關于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列是肯定會丟失的,因此一開始我就沒查這個列。
總結
以上是生活随笔為你收集整理的python行转列_pandas.DataFrame中pivot()如何实现行转列的问题(代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: abaqus的python安装文件在哪_
- 下一篇: python openstack rab