数分之Pandas(Python)基础总结
一、数据结构
1、Series
s1 = pd.Series(data = l)
s2 = pd.Series(data = l,index = list('abcdefgh'),dtype='float32')
s3 = pd.Series(data = {'a':99,'b':137,'c':149},name = 'python_score')
2、DataFrame
df1 = pd.DataFrame(data = {'python':[99,107,122],'math':[111,137,88],'en':[68,108,43]},
index = ['张三','李四','michael']) #行索引
df2 = pd.DataFrame(data = np.random.randint(0,151,size = (5,3)),
index = ['danial','brandon','softpo','ella','cindy'],
column = ['python','math','en']) #列索引
二、数据查看
df = pd.DataFrame(data = np.random.randint(0,151,size = (150,3)),
index = None,
columns = ['python','math','en'])
#查看其属性、概览和统计信息
df.head(10) #显示头部10行,默认5个
df.tail(10) #显示末尾10行,默认5个
df.shape #查看形状,行数和列数
df.dtypes #查看数据类型
#python int32
#math int32
#en int32
#dtype: object
df.index #行索引,RangeIndex(start=0, stop=150, step=1)
df.columns #列索引,Index(['python', 'math', 'en'], dtype='object')
df.values #对象值,二维ndarray数组,显示值
df.describe() #查看数值型列的汇总统计,计数、平均值、标准差、最小值、四分位数、最大值
df.info() #查看列索引,数据类型,非空计数
三、数据输入与输出
1、CSV
df = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]),
columns = ['IT','化工','生物','教师','士兵'])
df.to_csv('./salary.csv', #保存到 当前文件创建的目录下
sep = ';',
header = True,
index = True)
pd.read_csv('./salary.csv',
sep = ';',
header = [0],
index_col = 0)
#####
pd.read_table('./salary.csv',
sep = ';',
header = [0],
index_col = 1)
2、Excel
#pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
#pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple
df1 = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]),
columns=['IT','化⼯','⽣物','教师','⼠兵'])
df2 = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),
columns=['Python','Tensorflow','Keras'])
df1.to_excel('./salary.xls',
sheet_name = 'salary', #Excel中工作表的名字
header = True, #是否保存列索引
index = False) #是否保存行索引
pd.read_excel('./salary.xls',
sheet_name=0,
header = 0,
names = list('ABCDE'),
index_col=1)
with pd.ExcelWriter('./data.xlsx') as writer:
df1.to_excel(writer,sheet_name='salary',index = False)
df2.to_excel(writer,sheet_name='score',index = False)
pd.read_excel('./data.xlsx',
sheet_name='salary')
3、SQL
#pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
#pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
from sqlalchemy import create_engine
df = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),
columns = ['python','tensorflow','keras'])
conn = create_engine('mysql+pymysql://root:*********@localhost/********?charset=utf8mb4')
df.to_sql('score',
conn,
if_exists = 'append')
pd.read_sql('select * from score limit 10',
conn,
index_col = 'index')
4、HDFS
#pip install tables -i https://pypi.tuna.tsinghua.edu.cn/simple
import numpy as np
import pandas as pd
df1 = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪资情况
columns=['IT','化⼯','⽣物','教师','⼠兵'])
df2 = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 计算机科⽬的考
columns=['Python','Tensorflow','Keras'])
# 保存到当前路径下,⽂件命名是:data.h5
df1.to_hdf('./data.h5',key='salary') # 保存数据的key,标记
df2.to_hdf('./data.h5',key = 'score')
pd.read_hdf('./data.h5',
key = 'salary')#获取指定的标记、key的数据
四、数据选取
1、获取数据
df = pd.DataFrame(data = np.random.randint(0,151,size = [151,3]),columns=['Python','Tensorflow','Keras'])
df['Python'] #获取单列,Series
df.python
df.[['python','keeas']]
df[1:151].shape #(150, 3)
2、标签选择
df.loc[['A','C','D','F']] #选取指定行标签数据
df.loc['A':'E',['Python','Keras']] #根据行标签切片,选取指定列标签的数据
df.loc[:,['Keras','Tensorflow']] #默认保留所有⾏
df.loc['E'::2,'Python':'Tensorflow'] #行切片从标签E开始每2个中取一个,列标签进行切片
df.loc['A','Python'] #选取标量值
3、位置选择
df.iloc[4] # ⽤整数位置选择。
df.iloc[2:8,0:2] # ⽤整数切⽚,类似NumPy
df.iloc[[1,3,5],[0,2,1]] # 整数列表按位置切⽚
df.iloc[1:3,:] # ⾏切⽚
df.iloc[:,:2] # 列切⽚
df.iloc[0,2] # 选取标量值
4、boolean索引
cond1 = df.Python > 100
df[cond1] # 返回Python分数⼤于100分的⽤户所有考试科⽬数据
cond2 = (df.Python > 50) & (df['Keras'] > 50)
df[cond2] # 返回Python和Keras同时⼤于50分的⽤户的所有考试科⽬数据
df[df > 50]# 选择DataFrame中满⾜条件的值,如果满⾜返回值,不然返回空数据NaN
df[df.index.isin(['A','C','F'])] # isin判断是否在数组中,返回也是boolean类型值
5、赋值操作
s = pd.Series(data = np.random.randint(0,150,size = 9),index=list('BCDEFGHIJ'),name = 'PyTorch')
df['PyTorch'] = s #增加一列,DataFrame行索引自动对齐
df.loc['A','Python'] = 256 #按标签赋值
df.iloc[3,2] = 512 # 按位置赋值
df.loc[:,'Python'] = np.array([128]*10) #按NumPy数组进行赋值
df[df >= 128] = -df #按照where条件进行赋值,大于等于128变成原来的负数,否则不变
五、数据集成
1、concat数据串联
pd.concat([df1,df3],axis = 0) #df3追加在df1的后面,列增加
df1.append(df3) #df3追加在df1的后面,列增加
pd.concat([df1,df3],axis = 1) #df3追加在df1的后面,列不增加
2、插入
df.insert(loc = 1,column = 'pytorch',value = 1024)
#在第一列插入,列名为pytorch,值1024
#对行的操作,使用追加append,默认在最后面,无法指定位置
#如果想要在指定位置插入行:切割-添加-合并
3、JOIN SQL风格合并
pd.merge(df1,df2,
how = 'outer', #outer:全外联,inner:内连接,left:左外联,right:右外联
on = 'name')
pd.merge(left = df1,right = df2,
left_index = True, #左边DateFrame使用行索引进行合并
right_index = True) #右边的DataFrame使用行索引进行合并
六、数据清洗
df.duplicated() #判断是否存在重复数据
df.drop_duplicates() #删除重复数据
df.isnull() #判断是否存在空数据,存在返回True,否则返回False
df.dropna(how = 'any') #删除空数据
df.fillna(value = 1111) #填充空数据
del df['color'] #删除某列
df.drop(lables = ['price'],axis = 1) #删除指定列
df.drop(lables = [1,2,4],axis = 0) #删除指定行
df.filter(items = ['asdfg','fdsa']) #删除标签名
df.filter(regex = 'a$',axis = 1) #删除包含'a'的标签列
df.filter(like = 'a', axis = 0) #选中包含'a'的行标签
#过滤异常值
#3σ过滤异常值,σ即是标准差
cond = (df > 3*df.std()).any(axis = 1)
index = df[cond],index #不满足条件的行索引
df.drop(labels = index,axis = 0) #根据行索引,进行数据删除
job['positionName'].str.contains('数据') #职位中包含"数据"的
七、数据转换
1、轴和元素替换
df.iloc[4,2] = None #将5行3列的值替换为NAN
df.rename(index = {'A':'AA','B':'BB'},columns = {'Python':'智能'}) #重命名索引
df.replace(3,1024) #将3替换为1024
df.replace([0,7],2048) #将0和7替换为2048
df.replace({0:512,np.nan:998}) #根据字典键值对进行替换
df.replace({'python':2},-1024) #将python这一列中等于2的值替换为-1024
2、map Series元素改变
df['Keras'].map({1:'Hello',5:'World',7:'AI'}) # 字典映射
df['Python'].map(lambda x:True if x >=5 else False) # 隐式函数映射
def convert(x): # 显示函数映射
if x%3 == 0:
return True
elif x%3 == 1:
return False
df['Tensorflow'].map(convert)
3、apply元素改变。既支持Series,也支持DataFrame
df['Keras'].apply(lambda x:True if x >5 else False)
df.apply(lambda x : x.median(),axis = 0)
def convert(x):
return (x.mean().round(1),x.count())
df.apply(convert,axis = 1)
df.applymap(lambda x : x + 100)
4、transform变形
df['Python'].transform([np.sqrt,np.exp]) #一列多行处理
df.transform({'Tensorflow':np.max,'Keras':np.min}) #多列执行不同计算
5、重排随机抽样哑变量
df.take([4, 2, 9, 1, 3, 7, 5, 8, 0, 6])
df.take(np.random.randint(0,10,size = 15)) # 随机抽样
df = pd.DataFrame(data = {'key':['b','b','a','c','a','b']})
pd.get_dummies(df,prefix='',prefix_sep='')
八、数据重塑
df.T # 转置
df2.unstack(level = -1) # ⾏旋转成列,level指定哪一层,进行变换
df2.stack() # 列旋转成行
df2.stack().unstack(level = 1) # 行列互换
df2.mean() # 各学科平均分
df2.mean(level=0) # 行的平均分
df2.mean(level = 1) # 列的平均分
九、数学和统计方法
1、简单统计指标
df.count() #非NAN的数量
df.max(axis = 0) #0轴最大值,即每一列的最大值
df.min() #默认0轴
df.median() #中位数
df.sum() #求和
df.mean(axis = 1) #轴1的平均值
df.quantile(q = [0.2,0.4,0.8]) #分位数
df.describe() #汇总统计,计数、平均值、标准差、最小值、四分位数、最大值
2、索引标签、位置获取
df['python'].argmin() #计算最小值位置
df['keras'].argmax() #计算最大值位置
df.idxmax() #最大值索引标签
df.idxmin() #最小值索引标签
3、更多统计指标
df['python'].value_counts() #统计元素出现的次数
df['keras'].unique() #去重
df.cumsum() #累加
df.cumprod() #累乘
df.std() #标准差
df.var() #方差
df.cummin() #累计最小值
df.cummax() #累计最大值
df.diff() #计算差分
df.pct_change() #计算百分比变化(同比)
4、高级统计指标
df.cov() #所有属性的协方差
df['python'].cov(df['keras']) #python和keras的协方差
df.corr() #所有属性的相关系数
df.corrwith(df['tensorflow']) #tensorflow和df每一列的相关系数
十、数据排序
df.sort_index(axis = 0,ascending = True) #按0轴升序排序
df.sort_index(axis = 1,ascending = False) #按1轴降序排序
df.sort_values(by = ['python','keras']) #先按python,再按keras排序
df.nlargest(10,columns = 'Keras') #根据属性Keras排序,返回最大10个数据
df.nsmallest(5,columns = 'Python') #根据属性Python排序,返回最小5个数据
十一、分箱操作
pd.cut(df.python,bins = 3) #等宽分箱
pd.cut(
df.keras,
bins = [0,60,90,120,150]
right = False, #左闭右开
labels = ['不及格','中等','良好','优秀']
pd.qcut(df.python,q = 4,
labels = ['差','中','良','优']
) #等频分箱
十二、分组聚合
1、分组
df.groupby(by = 'sex')[['Python','Java']] #单分组,再获取数据
df.groupby(by = ['class','sex'])[['Python']] #多分组,再获取数据
df['Keras'].groupby([df['class'],df['sex']]) #获取数据,再多分组
df.groupby(df.dtypes,axis = 1) #按数据类型分组
2、分组聚合
df.groupby(df['class']).size()
df.groupby(df['class','sex']).size()
3、分组聚合apply、transform
df.groupby(by = ['class','sex'])[['Python','Keras']].apply(np.mean).round(1)
df.groupby(by = ['class','sex'])[['Python','Keras']a].transform(np.mean).round(1)
4、分组聚合agg
df.groupby(by = ['class','sex'])[['Python']].agg((('最小值',np.min),('最大值',np.max)))
#agg可以同时显示多个聚合函数
5、透视表pivot_table
df.pivot_table(values = ['Python','Keras','Tensorflow'], #要透视分组的值
index = ['class','sex'], #分组透视指标
aggfunc = {'Python':[('最大值',np.max)], #聚合运算
'Keras':[('最小值',np.min),('中位数',np.median)],
'Tensorflow':[('最小值',np.min),('平均值',np.mean)]})
十三、时间排序
1、时间戳操作
pd.Timestamp('2020-8-24 12') #时刻数据
pd.Period('2020-8-24',freq = 'M') #时期数据
index = pd.date_range('2020-08-24',periods=5,freq = 'M') #批量时刻数据
pd.period_range('2020.08.24',periods=5,freq='M') #批量时期数据
pd.Series(np.random.randint(0,10,size = 5),index = index) #给时间添加索引
pd.to_datetime(['2020.08.24','2020-08-24','24/08/2020','2020/8/24'])
pd.to_datetime([1598582232],unit='s') #转化为最小单位是秒的时间
pd.to_datetime([1598582420401],unit = 'ms') + pd.DateOffset(hours = 8) #东八区时间
pd.to_datetime([1598582420401],unit = 'ms') + pd.DateOffset(days = 100) #100天后日期
2、时间戳索引
ts['2020-08-30'] #日期访问数据的索引
ts['2020-08-24':'2020-09-3'] #日期切片
ts['2020-08'] #这个月的数据
ts['2021'] #这一年的数据
ts[pd.Timestamp('2020-08-30')] #日期访问数据的索引
ts[pd.Timestamp('2020-08-24'):pd.Timestamp('2020-08-30')] #切片
ts[pd.date_range('2020-08-24',periods=10,freq='D')]
ts.index.year #获取年
ts.index.dayofweek #获取星期几
ts.index.weekofyear #一年中第几个星期几
3、时间序列常用方法
#数据移动
ts.shift(periods = 2) # 数据后移
ts.shift(periods = -2) # 数据前移
ts.shift(periods = 2,freq = pd.tseries.offsets.Day()) # 按天移动
ts.shift(periods = 1,freq = pd.tseries.offsets.MonthOffset()) #按周移动
ts.asfreq(pd.tseries.offsets.Week()) #按周变化
ts.asfreq(pd.tseries.offsets.MonthEnd()) #按月末变化
ts.resample('3M').sum().cumsum() #以季度为单位进行汇总
#DataFrame重采样
d = dict({'price': [10, 11, 9, 13, 14, 18, 17, 19],
'volume': [50, 60, 40, 100, 50, 100, 40, 50],
'week_starting':pd.date_range('24/08/2020',periods=8,freq='W')})
df.resample('M',on = 'week_starting').apply(np.sum)
十四、数据可视化
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
df.plot() #线形图
df.plot.bar(stacked = True) #条形图 stacked是否堆叠
df.plot.barh() #水平条形图
df.plot.pie(subplots = True,figsize = (8,8),autopct = '%0.2f%%') #饼图,figsize尺寸,autopct显示百分数
df.plot.scatter(x = 'A',y = 'B') #绘制A和B的散点图
ax = df.plot.scatter(x='A', y='C', color='DarkBlue', label='Group 1');
df.plot.scatter(x='B', y='D'
,color='DarkGreen'
,label='Group 2'
,alpha = 0.5 #设置透明度