pandas.dataFrame 의 pivot()와 unstack()이 줄 을 돌 립 니 다.

예제:다음 표 가 있 습 니 다.줄 을 돌려 야 합 니 다.

코드 는 다음 과 같 습 니 다:

# -*- 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.fillna(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 이후 의 결 과 는 반드시 2 차원 표 이 고 행렬 과 그 에 대응 하 는 값 만 필요 합 니 다.또한 2 차원 표 이기 때문에 unpivot 이후 is패스 열 은 틀림없이 잃 어 버 릴 것 이기 때문에 처음부터 나 는 이 열 을 조사 하지 않 았 다.
추가 설명:
Pandas 의 차원 화 된 색인 부분 을 배 웠 을 때 2 개의 재 미 있 는 함 수 를 발 견 했 고 행렬 의 상호 전환 도 할 수 있 습 니 다.그 용법 은 다음 과 같 습 니 다.(오 랜 후에 야 pivot 는 unstack 의 빠 른 방식 을 봉 인 했 을 뿐 본질 적 으로 set 를 먼저 사용 한 다 는 것 을 깨 달 았 습 니 다.index 는 계층 화 된 색인 을 만 든 다음 에 unstack 으로 재 구축 합 니 다.마치 제 가 아래 예제 에서 한 작업 과 같 습 니 다)

# -*- 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.fillna(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 의 차원 화 된 색인 을 이 용 했 습 니 다.사실은 이것 도 차원 화 된 색인 의 주요 한 용도 입 니 다.본 사례 와 결합 하여 우 리 는 코드 를 다음 과 같이 바 꿀 수 있 습 니 다.

result_df=pd.read_sql('select UserName,Subject,Score from TEST',conn)

#                  :

    UserName Subject Score

0             80.0

1             90.0

2             70.0

3             85.0

4             80.0

5             92.0

6             76.0

7             60.0

8             82.0

9             96.0

10             78.0

#           ,        UserName Subject         ,Score        ,    set_index()  :

df=result_df.set_index(['UserName','Subject'])

In [112]: df.unstack()

Out[112]: 

     Score         

Subject                 

UserName            

      90.0 85.0 70.0 80.0

      92.0  NaN 76.0 80.0

      82.0 78.0 96.0 60.0

#   stack   unstack      ,               ,          。
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기