变量命名规范
1:区分大小写
2:只能包含字母、数字、下划线
3:不能以数字开头
4:可以用python关键字作为变量名,但最好不要这么干
赋值语句
i=2
i=j=2
a,b,c=1,2,3
a,b=b,a
通用函数
有确定性的数据结构可以用in, not in ,len, min, max
有序对象可以用索引
序列结构(list, tuple,str 等有顺序关系的数据类型)支持索引、切片、迭代、拆包式赋值、重复运算符(*)、专有函数
a[2] #索引
a[start:stop:step] # 切片,不包括stop
b,c,d=a # 拆包
a*3 or a+[1,2,3] or a+(1,2,3) # 重复运算
len(a) # 长度
sorted(a) # 不改变原序列 对应的可变数据类型有a.sort()
reversed(a) # 返回的是迭代器
enumerate(a) # 迭代器
zip(a,b) # 迭代器
3 in a # 包含
min(a), max(a)
del a[2]
a.count(10) # 统计10出现的次数
a.index(10) # 第一次出现10处的索引值
a>b or a<b or a==b a != b#比较第一个不同处的大小
a[2] #显示索引为2的数据
内置可变数据类型
list
a=[1,2,3]
a.append() # 合并,仅仅是讲数据放到最后一位
a.extend([1,2,3]) # [1,2,3,1,2,3]
a.insert(ind,data) # 插入
a.pop(ind) # 根据下标删除,没有ind默认删除最后一个数据,有返回值
a.remove() # 根据内容删除第一个符合条件的数据
range(1,10,2)# [1,3,5,7,9]不包含stop
append,extend,insert,pop,remove,len,sorted,reversed,enumerate,zip,in,min,max,del,count,index
dict
a={"name": 'sxj', "age": 18, 2:3} # key必须可以hash
a['name']
a['age']=18 # 添加
a.pop('name')
del a['name']
pop,del,len,in
set
a={1,2,3} # 支持集合运算,并| 交& 差- 对称差分^
a.add(4)
a.remove(4)
add,remove,len,,in,min,max
内置不可变数据类型
tuple
a=(1,2,3) or a=1,2,3
因为不可改所以没啥函数,只有序列通用函数
len,sorted,reversed,enumerate,zip,in,min,max,del,count,index
int float complex bool str frozenset
bool类型是int的子类
a='name' or a ="name" or a='''name''' # 转义字符\ \\
' '.join(['n','a']) #字符串合并
a+'1'
a.strip()
a.upper() or a.lower() # 改变大小写
a.sort() # 排序
第三方包数据类型
numpy
ndarray 代表一种特殊的数据结构-n维数组,有广播机制(±*/可以向长度不一致的轴向循环补齐)
生成数组
np.arange(1,10)
np.array([1,2,3])
np.zeros(5) or np.zeros(shape=(5,),dtype=np.int) # 5个0
np.ones(5) # 5个1
np.full(3,2) #3个2
数组切片与读取
a[start:stop:step]
a[[1,3,6]]
纬度的改变
b=a # 浅拷贝 共享内存空间
b=a.copy() # 深拷贝,内存空间不同,相互独立
a[:,np.newaxis] # 添加一个新纬度,本身没变
a.reshape([3,3]) # 改变纬度,本身没变
a.resize([3,3]) # **就地修改**,没有返回值
a.swapaxes(0,1) # 轴调换,本身没变
a.flatten() # 将多维数组转换成一维数组,本身没变
a.tolist() # 转换成list,本身没变
a.astype(np.float) # 重设数组元素的数据类型,本身没变
a1,a2,a3=np.split(a,[3,5]) # 在3,5这两个位置拆分
a1,a2=np.vsplit(a,[2]) # 纵向拆分
np.concatenate((a,b),axis=0) # 在0轴连接,其他轴必须大小相等
np.vstack([a,b]) # 纵向合并,必须列数相同
np.hstack([a,b]) # 必须行数相同
数据的更改
a*10 #
np.add(a,10)
np.delete(a,2) # 删除第二个数据
np.insert(a,2,88) # 在第二个索引出插入88
缺失值的处理
np.isnan(a) # 返回每个元素的TRUE, FALSE
np.any(np.isnan(a)) # 判断是否至少有一个缺失值
np.all(np.isnan(a)) # 判断是否所有都是缺失值
np.nansum(a) # 除了nan之外的和
np.sum(a) # 求和,如果有nan,返回值是nan
排序
np.sort(a,axis=0) # 本身不变
np.argsort(a) # 返回排序后的inex
属性计算
a.shape
a.ndim
a.size
np.sum(a) # np中的计算是向量计算,速度更快
pd.series
pandas定义的一种key-value型数据结构,有两种index,一种显式一种隐式
import pandas as pd
a=pd.Seriex([1,2,3],index=['a','b',c''])
a=pd.Series(10,index=['a','b','c']) # 只有一个元素的时候进行循环补齐
查看
a.index # 返回类型为index
a.values # 返回类型为array
a['b'] or a [1]
a[['b','c']] or a[0:1]
'a' in a
更改
a.reindex(['a','c','b']) # 只是更改显示顺序,如果是新的index,添加nan,本身不变
pd.dataframe
pandas提供的类似关系表的数据结构
三种生成dataframe的方法
a=dataframe([[1,2,3],[4,5,6]],columns=[‘col1’,‘col2’,‘col3’],index=[‘a’,‘b’])
b=dataframe([[1.1,1.2,1.3],[2.1,2.2,2.3]]) # 先构建数据,然后添加index,column
b.columns=['col4','col5','col6']
b.index=['c','d']
or b.rename(columns={'col4':'newname'...},index={},inplace=True) # 需要注意rename不加inplace不改元数据,只是改变了返回值
or b.rename(index=str) #将index设置成str
or b.rename(str.lower,axis='columns')
c=dataframe(columns=['a','b']) #建立了一个空的dataframe
c.loc[c.shape[0]]=[1,2] #添加行
c['newname']=.... #添加列
导入与导出
df.to_csv()
pd.read_csv()
df.to_excel()
pd.read_excel()
查看数据
df.head(2)
df.tail(2)
df.index
df.columns
df.columns.size
df.shape
df[['c1',c2']] or df.c1
df.loc[:,'c1':'c3']
df.iloc[:,0:2]
df[df.c1>100][['c1','c2']]
df.loc[df.c1>100,['c1','c2']
更改数据
df.reindex(index=[],columns=[],fill_value=100) # 只是调整index的顺序,如果有新的添加100
df.drop(['i1'],axis=1,inplace=True) # 本身不变
del df['c1'] # 只能删除列
df.loc['i1','d1']=0
a.loc[a.shape[0]]=[1,2] #添加行
a['newname']=...#添加列
a.astype(np.int32) # 改变数据类型
a.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
a.set_index('column_name',inplace=True)
df.stack() #建立多级索引
df.unstack() #撤销多级索引
算术运算
(+ - * / )是将对应索引的运算,不对应的索引取并,赋值‘nan’,如果不想用‘nan’填充,可以用a.add(b,axis,fill_value=0),sub,mul,div,可以将dataframe和series进行运算,(±*/)可能会出问题
运算数可以是series,dataframe,constant,constant就是全加同一个数,series是(axis=0)每行加不同的数
好多的运算可以用numpy来操作
df1+df2 # 行和lieder显式index为依据对元素计算,不足部分NAN,series参与计算的时候默认当成一行
df1.add(df2,fill_value=10,axis=1) # 对应元素计算,不足部分用fill_value, axis 调整按行还是按列计算 -sub * mul / div
df.cumsum()
df.rolling(2,axis=1).sum()
df.cov() # 协方差矩阵
df.corr() # 相关系数矩阵
df.T # 转置
df.idxmax(axis=0,skipna=True) #最大值对应的索引
df.apply(lambda x: x.sum(),axis=0)
缺失值
df.empty # 判断是否为空
df.isnull() #判断每个元素是否为空
df.notnull() #判断每个元素是否为非空
df.dropna(axis='index') # 含有空的行被删除
df.fillna(0) #用0来补充所有的缺失值
df.fillna(method='ffill') #向前填充缺失值 bfil 向后填充缺失值
排序
a.reindex([],axis=0,method=,fill_value=np.nan)#对行重排序,没有的默认‘nan’ reindex生成新的dataframe,原来的不变,axis=0是对index处理,1对columns处理,na_position ='last' or 'first',默认‘last’
a.sort_index(axis=0,ascending=False,na_position='last',inplace=True)
a.sort_values(by=[],axis=0,ascending=False,na_position='first',inplace=True)
a.reset_index(drop=True,inplace=True) 仅重新生成索引(inplace)
df.set_index([],inplace=True)将某一列设成index,原有的index消失
统计
df.describe() # 按列的统计值 count,mean,std,min,25%....%75,max
df.count()
df.mean()
分组统计
df.groupby('c1')['c2'].mean() #按c1分组对c2进行平均
df.groupby('c1')['c2'].aggregate(['mean','sum','max',np.median]) # 多种计算
df.groupby('c1').apply(myfunc) # 自定义的处理函数
df的合并
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True) #尽量用这个,可以行,也可以列
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False) # 返回的格式:on,left1,left2,right1,right2, 只能行合并
a.append(other, ignore_index=False, verify_integrity=False)#列取并集,index单纯叠加 摞起来, 即将被废弃
a.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
例子
a=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['s1','s2','s3'],columns=['a','b','c'])
a b c
s1 1 2 3
s2 4 5 6
s3 7 8 9
b=pd.DataFrame([[10,11,12],[13,14,15],[16,17,18]],index=['s1','s2','s4'],columns=['a','b','d'])
a b d
s1 10 11 12
s2 13 14 15
s4 16 17 18
merge 空,因为列名相同的没有相同的值
concat a b c d
s1 1 2 3.0 NaN
s2 4 5 6.0 NaN
s3 7 8 9.0 NaN
s1 10 11 NaN 12.0
s2 13 14 NaN 15.0
s4 16 17 NaN 18.0
append
移位
a.shift(n,axis=0)
选行
& | and or
两侧是数值的时候,& |进行位运算, and or根据是不是0输出
两侧是布尔值的时候,一样
注意在dataframe中选择切片的时候一定要用& |
a.loc[() & (),...]
a.loc[() | (),...]
去重
a.drop_drop_duplicates(col_name, ‘first’, inplace=True)
日期与时间
python中,与时间处理相关的模块有:time, datetime, calendar
时间的表述格式:时间戳, 格式化的字符串, 元组(struct_time共九种元素) ,另外python的time模块是调用C库实现的,所以在不同的平台可能会有所不同。
以time举例:
时间戳(timestamp):从1970年1月1日0点到现在的秒数,time(),clock() 返回timestamp
世界协调时(UTC):在中国UTC+8
DST:夏令时
struct_time: gmtime(), localtime(), strptime()返回struct_time
string: format: %Y, %m %d, %H %M %S
import time
t = time.gmtime() #返回格林威治时间 struct_time
t = time.localtime() #返回当地时间struct_time tuple
t.tm_year # 返回年
t = time.time() # timestamp
time.localtime(t) # timestamp ----> struct_time
time.gmtime(t) # timestamp ----> utc
time.mktime(time.localtime()) # struct_time---->timestamp
time.strftime(format,time.localtime()) # struct_time ----> string
time.strptime(str_time,format) # string ---->struct_time
time.sleep() # 程序休眠时间
time.clock() # cpu的累计时间
matplotlib指定时间为datetime格式。默认无时区操作,除非指定或者特殊操作
datetime.utcnow() utc时间
datetime.now() 当地时间
datetime.strptime()
datetime.strftime()
转换时区
tz_utc = timezone(timedelta(hours=8))
current_time_utc_8 = datetime.utcnow().replace(tzinfo=tz_utc)
pandas中的时间
import pandas as pd
pd.period_range('2019-01',periods=10,freq='D') #返回periodindex
随机数
一次生成一个随机数
import random
random.seed(3) #设置种子数,如果不设置每次生成的随机数不一样,如果设置了,生成的随机数是一样的
random.randint(1,100) #随机生成一个整数
random.uniform(-10,10) #随机生成一个实数
round(random.uniform(-10,10),2) # 小数点后保留两位
一次生成一个随机数组
import numpy as np
rand = np.random.RandomState(32) # 生成随机变量的生成器,32是种子数
rand.randint(0,10,(3,6)) # 3*6 范围在0-10之间的随机整数
rand.rand(5) # 服从均匀分布的实数
rand.randn(5) # 服从正态分布的实数
np.linspace(0,10,20) # 0-10之间20个等距数列
特殊数据类型
None # python 提供的特殊数据类型,不能参加算术运算
np.nan 是np,pd提供的数据类型,属于float,可以参加算术运算
查看数据
type(x) # 显示x的数据类型
isinstance(x,int) # 查看x是否是int类型的
del x #删除已定义变量
dir() # 查看所有已定义变量
import keyword
keyword.kwlist # 查看python关键字