pandas高级操作

数据库操作:
import pymysql
from sqlalchemy import create_engine
import pandas as pd
#建立连接格式
conn=create_engine(‘mysql+pymysql://user:password@IP:3306/test01’)
conn=create_engine(‘mysql+pymysql://root:lycdj@localhost:3306/test01’)
df1=pd.read_sql(sql,conn)
df1.head(5)

def query(table):
	host='localhost'
	user='root'
	password='ly124220'
	database='test01'
	port=3306
	conn=create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(user,password,host,port,database))
	sql='select * from ' + str(table)
	results=pd.read_sql(sql,conn)
	return results

df2=query(‘appendix’)
df2.head(5)
将本地的数据保存到数据库中去
import os
os.chdir(r’E:\python\python_practice’)
df=pd.read_csv(‘fh.csv’)
try:
df.to_sql(‘testdf’,con=conn,index=False,if_exist=‘replace’)
except:
print(‘error’)
数据整合:

import pandas as pd
    df1=pd.DataFrame({'id':[1,2,3,4,5],'name':['张三','李四','王二','丁一','赵五'],'age':[25,23,45,26,21],'gender':['男','男','女','男','女']})
    df2=pd.DataFrame({'Id':[1,2,2,4,5,6,7],'kemu':['科目1','科目1','科目2','科目1','科目2','科目3','科目4'],'score':[82,86,84,84,85,87,99]})
    df3=pd.DataFrame({'id':[1,5,6],'name':['张三','李四','王二'],'income':[23600,52460,45123]})
    merged=pd.concat([df1,df2,df3],axis=1,join='outer')

在这里插入图片描述
import os
os.chdir(‘E:\python\python_practice’)
order1=pd.read_excel(‘python_exclce.xlsx’,sheet_name=‘Sheet1’,header=0)
order2=pd.read_excel(‘python_exclce.xlsx’,sheet_name=‘Sheet2’,header=0)
order3=pd.read_excel(‘python_exclce.xlsx’,sheet_name=‘Sheet3’,header=0)
data=pd.concat([order1,order2,order3],axis=0,ignore_index=True)
data.reset_index(drop=True,inplace=True)
左连接和右连接:right,left,all,inner
mergel=pd.merge(left=df1,right=df2,how=‘right’,left_on=‘id’,right_on=‘Id’)
在这里插入图片描述
按索引来连接:
mergel=pd.merge(left=df1,right=df2,how=‘inner’,left_index=True,right_index=True)
在这里插入图片描述
df=pd.read_csv(‘qunar_free_trip.csv’)
df1=pd.read_csv(‘qunar_route_cnt.csv’)
data=pd.merge(df,df1,left_on=[‘出发地’,‘目的地’],right_on=[‘出发地’,‘目的地’],sort=True)

层次化索引
order.index.names
order.loc[4511].loc[145]
order.loc[(4511,145),:]
order.loc[(4511,[145,1025]),:]
order.loc[(a,b),:]
order.loc[(2451,[415]),:]
order.loc[(2154,142),:]
order.loc[(1224,[421,1456]),[‘dishes_id’,‘logicprn_crn’]]
order.loc[(2546,[452,1025]),‘parent_class_name’]
df.loc[(a,b),:]

数据排序
import os
import numpy as np
import pandas as pd
os.chdir(r’E:\python\python_practice’)
vgsales=pd.read_csv(‘vgsales.csv’,encoding=‘utf-8’,dtype={‘Year’:float})
vgsales.isnull()
np.sum(vgsales.isnull(),axis=0)
vgsales.sort_values(‘Year’,ascending=True,na_position=‘last’,inplace=True)
ascending=True控制升序和降序
控制索引
vgsales.reset_index(drop=True,inplace=True)
vgsales.sort_values([‘NA_Sales’,‘EU_Sales’]) #先排前一个变量,从小到大,在按后一个变量排序,从小到大

分组聚合
import pandas as pd
import numpy as np
import os
os.chdir(‘E:\python\python_practice’)
vgsales=pd.read_csv(‘vgsales.csv’,dtype={‘Year’:float}) #有缺失值只能读成浮点型数据
var_name=[‘NA_Sales’,‘EU_Sales’]
np.min(vgsales[var_name],axis=0)
np.median(vgsales[var_name],axis=0)
np.max(vgsales[var_name],axis=0)
vgsales[var_name].cumsum(axis=0)
vgsales[var_name].quantile([0,0.2,0.5,1])
vgsales[var_name].describe(include=[‘object’])

groupde=vgsales.groupby(‘Year’)
type(groupde)
groupde.median()
groupde.max()
groupde.min()
groupde.count()
groupde.size()
groupde.cumcount()

names=[‘Year’,‘Genre’,‘NA_Sales’]
grouped=vgsales[names].groupby(by=[‘Year’,‘Genre’])
grouped.mean()
grouped.median().loc[([1982,1983],‘Fighting’),:]

聚合函数
agg:方法灵活,能够对分组对象进行相同的聚合,还可以选择不同的聚合方法
apply:apply可以进行聚合计算,还可以按行计算
transform:返回与数据同样长度的行,无法进行聚合
更多的使用apply和agg
import pandas as pd
import numpy as np
import os
os.chdir(‘E:\python\python_practice’)
names=[‘Year’,‘Genre’,‘NA_Sales’]
grouped=vgsales[names].groupby(‘Year’)
grouped.agg([np.mean,np.sum])
grouped.agg([np.mean,np.sum]).loc[[1980,1981],(‘NA_Sales’,[‘mean’,‘sum’])]
grouped.agg({‘NA_Sales’:[np.sum,np.median],‘EU_Sales’:[np.mean,np.sum]})

自定义函数
def DoubleSUM(data):
s=data.sum()*2
return s
grouped.agg({‘EU_Sales’:DoubleSUM})
grouped.sum()[‘NA_Sales’]
vgsales.agg({‘EU_Sales’:DoubleSUM})
vgsales[‘EU_Sales’].sum()*2

var_names=[‘NA_Sales’,‘EU_Sales’,‘JP_Sales’]
vgsales[var_names].apply(np.sum,axis=0) #axis=0沿着行的方向进行作用
vgsales[var_names].apply(lambda x:x[2]-x[3],axis=1) #axis=1沿着列的方向进行作用

#transform函数
vgsales[var_names].transform(np.sum)
grouped.mean().transform(lambda x: x2)
vgsales[var_names].transform(lambda x:x
2)

透视图和交叉表
import pandas as pd
import numpy as np
import os
oc.chdir(‘E:\python\python_practice’)
df=pd.read_csv(‘vgsales’,dtype={‘Year’:float})
可以有两层索引(透视图):
pd.pivot_table(dataa=df,index=[‘Year’,‘platform’], columns=‘Genre’,values=‘Global_Sales’,aggfunc=[np.mean,np.median], margins=True,fill_value=0,margins_name=‘总计求均值’).head(10)
交叉表:
pd.crosstab(index=df[‘Platform’],columns=df[‘Genre’],margin=True,values=‘NA_Sales’,aggfunc=np.sum)

pd.crosstab(index=df[‘Platform’],columns=df[‘Genre’],normalize=‘all’,margin=True,values=‘NA_Sales’,aggfunc=np.sum)
normalize=‘index’ 计算行的百分比
pd.crosstab(index=df[‘Platform’],columns=df[‘Genre’],normalize=‘index’,margin=True,values=‘NA_Sales’,aggfunc=np.sum)
normalize=‘columns’ 计算列的百分比
pd.crosstab(index=df[‘Platform’],columns=df[‘Genre’],normalize=‘columns’,margin=True,values=‘NA_Sales’,aggfunc=np.sum)

pandas数据处理
import pandas as pd
import numpy as np
import os
os.chdir(‘E:\python\python_practice’)
sec_cars=pd.read_csv(‘sec_cars.csv’)
sec_cars.head(20)
sec_cars.dtypes
sec_cars[‘Boarding_time’]
sec_cars[‘Boarding_time’]=pd.to_datetime(sec_cars[‘Boarding_time’],format=’%Y年%m月’,errors=‘coerce’)
sec_cars[‘New_price’].str[:-1]
sec_cars[‘New_price’].value_counts() 做计数用,计算数据中有多少个不同的值
sec_cars=pd.read_csv(‘sec_cars.csv’,na_values=‘暂无’) 将’暂无’当做缺失值处理
sec_cars[‘New_price’].str[:-1].astype(‘float’)
sec_cars[‘New_price’].unique() 查看有哪些不同的取值
统计字段对应的值出现的次数:
sec_cars[‘Discharge’].value_counts()
sec_cars[‘Discharge’].str.replace(’–’,‘缺失值’) #做替换一定要是字符串类型,否则就会报错
sec_cars.dtypes
sec_cars.describe(include=[‘object’]) #统计字符型变量的统计量
sec_cars.describe(include=‘all’) #查看变量的基本统计量的情况
计算时间差的方法:
sec_cars[‘diff_day’]=pd.datetime.today()-sec_cars[‘Boarding_time’]
pd.datetime.today()
转换成天数:

sec_cars['diff_day']=(sec_cars['diff_day']/np.timedelta64(1,'D')).astype(int)
sec_cars['diff_year']=pd.datetime.today().year - sec_cars['Boarding_time'].dt.year

type(pd.datetime.today())
df=pd.read_excel(‘data_test03.xlsx’,dtype={‘tel’:str,‘birthday’:np.datetime64})
df.head(5)
把手机号码中间的隐藏掉:
df[‘tel’] = df[‘tel’].apply(lambda x:x.replace[x[3:7],’*****’])
df[‘email’] = df[‘email’].apply(lambda x:x.split(’@’)[1])
df[‘new_tel’] = df[‘tel’].str[0:3]
df[‘tel’].apply(lambda x: x[0:3])

df=pd.read_excel(‘Online_Retail.xlsx’)
df.shape
data=df.sample(n=50000,replace=False)
data.dtypes
df[‘date’]=df[‘InvoiceDate’].dt.date
df[‘InvoiceDate’].dt.time
df[‘total_price’]=df[[‘Quantity’,‘UnitPrice’]].apply(np.prod,axis=1)
按日期进行汇总,计算每一天的订单总价
grouped_data = data.groupby(by=‘Date’).sum()
查看索引
grouped_data.index=pd.to_datetime(grouped_data.index)
grouped_data[‘总价变化率’] = grouped_data[‘total_price’].pct_change()
grouped_data[‘sma_5’]=grouped_data[‘total_price’].rolling(5).mean()
grouped_data[[‘SMA_5’,‘SMA_10’]].plot()
grouped_data[‘total_price_before’]=grouped_data[‘total_price’].shift(1) #向下平移一个单位,如果是-1则向上平移一个单位
grouped_data[‘total_price’].pct_change() #pct_change计算变化率,用下一行减去上一行,在除以上一行
grouped_data[‘total_price’].diff(1)

数据清洗:
import os
import pandas as pd
import numpy as np
oc.chdir(‘E:\python\python_practice’)
df=pd.read_excel(‘aa.xlsx’)
df.duplicated() #y有重复的就是True
df.duplicated(subset = [‘appname’,‘comment’],keep=‘last’) #保留最后一个
np.sum(df.duplicated()) #计算重复值的个数
df.drop_duplicated(subset=[‘comment’,‘install’],inplace=True) 删除重复值

缺失值处理:
均值替换
前向和后向替换
常数替换
df = pd.read_excel(‘data_test05.xlsx’)
np.sum(df.isnull(),axis=1)
df.apply(lambda x: sum(x.isnull())/len(x), axis=0) #统计行的缺失率
df.dropna()
df.dropna(how=‘any’,axis=0) 沿着行做操作,有一个缺失就删除一行
df.dropna(how=‘all’,axis=0) 沿着行做操作,全部缺失才删除这一行
df.drop(subset=[‘age’,‘gender’],axis=1)
df.drop(labels=[‘age’,‘gender’],axis=1)
df.drop(labels=[‘age’,‘gender’],how=‘any’,axis=0)

填补法处理数据:
df.age.fillna(df.age.mean()) 用均值进行填补
df.age.fillna(df.age.median()) 用中位数进行填补
df.gender.fillna(df.gender.mode()) 众数
df.gender.mode()[0] 取第一个众数
df.fillna(20) 全部用20进行填补
df.fillna(value={‘gender’:df.gender.mode()[0],‘age’:df.age.mean(),‘income’:df.income.median()}) 字典的填补方法

df.fillna(method=‘ffill’) 前向填补
df.fillna(method=‘bfill’) 后向填补

df.age.interpolate(method=‘linear’) 线性差值填补
df.age.interpolate(method=‘polynomial’,order=2) 多项式差值

异常值判断
import pandas as pd
import numpy as np
import os
os.chdir(‘E:\python\python_practice’)
sunspots=pd.read_csv(‘supports.csv’,sep=’,’)
xbar=sunspots.counts.mean() 均值
xstd=sunspots.counts.std() 标准差
xbar + 2xstd 上限
xbar - 2
xstd 下限
any(sunspots.counts > xbar + 2xstd)
any(sunspots.counts< xbar - 2
xstd)
sunspots.counts.plot() 分布画图

计算分位数:
Q1=sunspots.counts.quantile(q=0.25) 下四分位数
Q3=sunspots.counts.quantile(q=0.75) 上四分位数
IQR=Q3-Q1 分位差
any(sunspots.counts >Q3+ 1.5IQR) 返回True有异常值 上限
any(sunspots.counts <Q1-1.5
IQR) 下限
sunspots.counts.plot(kind=‘box’) 通过相嵌图来查看是否有异常值
sunspots.counts.describe() 统计
UL=Q3 +1.5*IQR
replace_value = sunspots.counts[sunspots.counts <UL].max()
sunspots.loc[sunspots.counts>UL,‘counts’]=replace_value
P1=sunspots.counts.quantile(0.01)
P99=sunspots.counts.quantile(0.99)
sunspots[‘counts_new’]=sunspots[‘counts’]
sunspots.loc[sunspots[‘counts_new’]>P99,‘counts_new’]=P99
sunspots.loc[sunspots[‘counts_new’]<P1,‘counts_new’]=P1

数据离散化:
import pandas as pd
import numpy as np
import os
os.chdir(‘E:\python\python_practice’)
sunspots=pd.read_csv(‘sunspots.csv’)
sunspots[‘counts_bin’]=pd.cut(sunspots[‘counts’],4,labels=range(1,5))
sunspots[‘counts_bin’].values_counts()
sunspots[‘counts_bin’].hist() #画出分布图

等宽等批分段:
k=4
w=[i/k for i in range(k+1)]
pd.qcut(sunspots[‘counts’],w,labels=range(0,4))
sunspots[‘counts_bin’].hist()

k=4
w1=sunspots[‘counts’].quantile([i/k for i in range(k+1)])
pd.cut(sunspots[‘counts’],w1,labels=range(0,4))
sunspots[‘counts_bin’].hist()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值