目录
缺失值
None和nan
1.None
- None是Python自带的,是Python中的空对象。None不能参与到任何计算中。
- object类型的运算要比int类型的类型慢得多
2.np.nan
- np.nan是浮点类型,能参与到计算中。但计算结果总是NaN
但可以使用np.nan*()函数来计算nan,此时会自动过滤掉nan,如np.nansum()
缺失值检测
pandas中None和np.nan都视作np.nan
isnull():判断是否为空,为空显示True,否则显示False
notnull():判断是否不为空,与isnull()相反
all():必须全部为True的行或列,这行或列才会是True,类似and,作用是尽量找到没有空值的行或列。默认是找列,传入axis = 1则可找行。
any():只要有一个为True,这行或列就为True,类似or,作用是尽量找有空的行或列。默认是找列,传入axis = 1则可找行。
过滤
- 使用bool值过滤
先通过isnull()、notnull()、all()、any()得到行或列的bool值,再将bool值传给切片过滤为空的行或列。 - 过滤函数dropna()
默认是删除有nan的行,传入axis=1删除有nan的列。
默认是how=‘any’,有一个nan就删除,设置为how='all’时必须所有数据都为nan才会删除。
传入inplace=True时会修改原数据。
填充
填充函数fillna()
传入value = 100可将nan填充为100
传入limit限制填充的次数
传入method='ffill’表示向上填充,将上面的值填充到nan,再传入axis=1表示向左填充,method='backfill’表示向下填充,将下面的值填充到nan,再传入axis=1表示向右填充。
重复值处理
- 使用duplicated()函数检测重复的行
返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True。
传入keep = 'first’表示保留重复的第一行,即重复的第一行为False(默认)
传入keep = 'last’表示保留重复的最后一行,即重复的最后一行为False
传入keep = False表示不保留重复的任何一行,即重复的每一行为True
传入subset(子集)指定检测的数据,如df.duplicated(subset=[‘A’,‘B’]) - 使用drop_duplicates()函数删除重复的行
默认保留重复的第一行,也可使用keep和subset指定保留哪行和检测哪些数据。
数据映射
replace()函数
对value进行替换操作,如df.replace({5:100,1:50})
map()函数
适合处理某一单独的列,使用map时要先取列。
【注:map一般用在Series数据结构,不能用于DataFrame。】
map函数中可以使用lambda函数,如df[‘A’].map(lambda x : x*10)
map中也可以传入普通函数,先定义普通函数,再将函数名传给map。
rename()函数
替换索引。
默认是修改行索引名,如果要修改列索引名需要传入axis=1
df.rename({‘张三’ : ‘Zhangsan’})
df.rename(index = {‘张三’ : ‘Zhangsan’}) #与上一行一样修改行
df.rename({‘李四’ : ‘lisi’}, axis = 1)
df.rename(columns = {‘李四’ : ‘lisi’}) #与上一行一样修改列
reset_index()和set_index()
reset_index():重置行索引,原来的行索引会变成一列数据。
set_index():设置行索引,将原来的一列数据变成行索引。
df.reset_index()
df.set_index(keys = ‘name’)
apply()函数
用于处理数据,既支持Series,也支持DataFrame。
用于Series,其中x表示Series中的元素。
df[‘A’].apply(lambda x : True if x > 5 else False)
用于DataFrame,其中x是DataFrame中某列或某行的series数据,默认是列。
df.apply(lambda x : x.mean(), axis = 1) #求每一行数据的平均值
也能自定义方法传入apply()中,通过axis改变行列。
applymap():DataFrame专有的方法,其中x是每个元素。
df.applymap(lambda x : x + 100)
transform()函数
Series中使用transform,可以执行多项函数
df[‘A’].transform([np.sqrt, np.exp])
DataFrame中使用transform,默认是对列处理,可设置axis=1对行处理。
pandas异常值处理
- df.describe():查看每一列的描述性统计量。
- df.std():可以求得DataFrame对象每一列的标准量。
- df.drop():删除特定索引。
默认是删除行,要删列加axis = 1
df.drop(‘a’)
df.drop(‘A’, axis = 1)
也可以指定行列
df.drop(index = ‘a’)
df.drop(columns = ‘A’)
删除多行多列
df.drop(index = [‘a’, ‘b’])
df.drop(columns = [‘A’, ‘B’])
- unique():唯一,去重。
【注:DataFrame没有unique(),要用Series调用。】
df[‘A’].unique() # 返回的是数组。
- df.query():按条件查询
【注:函数括号里的条件要用引号引起来。】
- df.sort_values():根据值排序。
- df.sort_index():根据索引排序。
- df.info():查看数据信息
抽样
- 使用.take()函数排序
- 可以借助np.random.permutation()函数随机排序
df.take([1,0,2]) # 默认是按照行索引排序,数字表示索引
df.take([1,0,2], axis = 1) # 按照列排序
随机排序:np.random.permutation([0,1,2])
无放回抽样:依次随机取出,没有重复值
df.take(np.random.permutation([0,1,2]))
有放回抽样:可能会出现重复值
df.take(np.random.randint(0,3,size = 5))
pandas数学函数
【注:都是默认对列操作,可以用axis = 1改为对行操作。】
对所有元素求和:df.values.sum()
cumsum():每一列中对应第几行就对前面几行求和。cumpord()同理。
df[0].cov(df[1]) 第0列和第1列的协方差
df.corrwith(df[1]) 单一属性相关性系数
pandas数据分组聚合
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
- 分组:先把数据分成几组
- 用函数处理:为不同组的数据应用不同的函数以转换数据
- 合并:把不同组得到的结果合并起来
数据分类处理的核心:groupby()函数
要按哪列分组就传入参数by指定哪列分组
df.groupby(by = ‘A’) # 得到的是分组后的对象
可使用.groups属性查看各行的分组情况
df.groupby(by = ‘A’).groups()
分组+聚合
df.groupby(‘A’).sum()
分组后求和
pandas加载数据
CSV数据加载
df.to_csv:保存到csv
df.to.csv(‘data.csv’, sep = ‘,’, header = True, index = True)
data.csv:保存到data.csv文件中
sep:分隔符,一般是逗号
header:是否保存列索引
index:是否保存行索引
pd.read_csv:加载csv数据
pd.read_csv(‘data.csv’, sep =‘,', header = [0], index_col = 0)
直接使用pd.read_csv(‘data.csv’)也可以
sep:默认是逗号
header:默认是取数据的第0位作为列索引,也能自己指定,如果传入None则列索引将会变表里的一行数据。
index_col:加载出来的数据默认是会再加上一列行索引,设置为0则是把原来表中的第0列作为行索引。
pd.read_table:和read_csv一样用于加载数据
pd.read_table(‘data.csv’, sep = ‘,’, index_col = 0)
分隔符sep默认是 ”\t“
excel数据加载
df.to_excel:保存到excel文件
df.to_excel(‘data.xlsx’,sheet_name = ‘Sheet1’, header = True, index = True)
sheet_name:工作表名称
header:是否保存列索引
index:是否保存行索引
pd.read_excel:读取excel
pd.read_excel(‘data.xlsx’,sheet_name = ‘Sheet1’, header = [0,1])
header:指定列作为列索引
pd.read_excel(‘data.xlsx’,sheet_name = 0, header = 0,names = list(‘ABCD’))
sheet_name = 0:读取第一个工作表
names:替换原来的列名
pandas分箱操作
分箱操作就是将连续型数据离散化,分箱操作分为等距分箱和等频分箱。
- 等距分箱
- 等频操作
时间序列
创建时间戳
创建
pd.Timestamp(‘2030-2-3’) # 时刻数据
pd.Period(‘2030-2-3’, freq = ‘D’) # 时期数据
freq:Y表示精确到年,M表示精确到月,D表示精确到日,默认是D
批量生成时刻时期数据
periods = 4:创建4个时间
freq = ‘D’:按天为间隔时间,按M时是取这月最后一天,按Y时是取这年最后一天
pd.date_range(‘2030.2.13’, periods = 4, freq = ‘D’) # 时刻数据
pd.period_range(‘2030.2.13’, periods = 4, freq = ‘D’) # 时期数据
时间戳索引
时间转换、索引和切片
时间转换
索引
ts[‘2023-03-15’] # 索引
ts[‘2023-03’] # 3月份
ts[‘2023-3’] # 3月份
ts[‘2023’] # 年
时间戳索引
ts[pd.Timestamp(‘2023-03-15’)]
切片
ts[‘2023-03-15’ : ‘2023-03-22’]
ts[pd.Timestamp(‘2023-03-15’) : pd.Timestamp(‘2023-03-22’)]
ts[pd,date_range(‘2023-03-15’, periods = 10, freq = ‘D’)] # 以天为间隔取从2023-03-15开始的后10天
属性
ts.index # 取到时间
ts.index.year # 取到所有的年份
ts.index.month # 取到所有的月
ts.index.day # 取到所有的日
ts.index.dayofweek # 取得星期几
时间序列常用方法
- 移动
ts.shift() # 默认后移1位,指的是值后移一位,没被补位的补NaN
ts.shift(periods = 2) # 后移2位
ts.shift(periods = -2) # 前移2位
- 频率转换
ts.asfreq(pd.tseries.offsets.Week()) # 天换为星期
ts.asfreq(pd.tseries.offsets.MonthEnd()) # 天换为月
由少变多:会有大量数据为空,可以用fill_value填充
ts.asfreq(pd.tseries.offsets.Hour(), fill_value = 0) # 天换为小时
重采样resample
resample:根据日期维度进行数据聚合
- 按照分钟(T)、小时(H)、日(D)、周(W)、月(M)、年(Y)等来作为日期维度
ts.resample(‘2D’).sum() # 以2天为单位进行汇总,求和
ts.resample(‘2W’).sum() # 以2星期为单位进行汇总,求和
ts.resample(‘3M’).sum() # 以3个月为单位进行汇总,求和
ts.resample(‘3M’).sum().cumsum() # 以3个月为单位进行汇总,求和,进行累加
ts.resample(‘H’).sum() # 以1小时为单位进行汇总,求和
ts.resample(‘T’).sum() # 以1分钟为单位进行汇总,求和
ts.resample(‘S’).sum() # 以1秒为单位进行汇总,求和
时区
使用时区要先导包
tz:timezone时区
import pytz
pytz.common_timezones # 可以查看常用的时区
ts.tz_localize(tz = ‘UTC’) # 时区表示,UTC国际标准时区
ts.tz_convert(tz = ‘Asia/Shanghai’) # 时区转换,将时区转为Shanghai