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 , , 。
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Pandas】DatetimeIndex란? no.29안녕하세요, 마유미입니다. Pandas에 대한 기사를 시리즈로 작성하고 있습니다. 이번은 제29회의 기사가 됩니다. 에서 Pandas의 시간에 대한 모듈에 대해 씁니다. 이번 기사에서는, 「DatetimeIndex」...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.