数分之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    #设置透明度