1、pandas简洁
高性能数据分析工具,帮助处理除了数值之外包括字符串,时间序列等在内的数据
2、pandas基本数据类型
1、Series 一维,带标签数组
1、创建series
1、指定索引
pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))
index=*** 指定索引,这里的是list类型的大写字母前10作为索引
2、通过字典创建一个series,其中字典的键就是series的索引
a = {}
pd.Serirs(a)
2、Series的切片和索引
1、Series的索引
1、数字索引
t = pd.Serirs(a)
t[1] # 取第一个数据
t[[2, 3, 6, 9]] # 取第2、3、6、9个数据
t[t>4] # 取索引大于4的所有值
2、键值索引
t['F'] # 取键值为F的值
t[['A', 'D', 'S']] 取键值为A、D、S的值
2、Series的索引
t[2:10:2] # 从第3开始依次加2,不包括11
3、取出索引和值
t = pd.Serirs(a)
t.index # index属性取出键值
t.value # 取出所有的值values
2、DataFrame 二维,Series容器
1、pd.DataFrame(a, index=index, columns=columns)
DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
[ex]:
a = np.arange(12).reshape((3, 4))
index = ['张飞', '关羽', '刘备']
columns = ['曹操', '于禁', '张颌', '徐晃']
a = pd.DataFrame(a, index=index, columns=columns)
2、基础属性
DataFrame的基础属性
df.shape # 行数列数
df.dtypes # 列数据类型
df.ndim # 数据维度
df.index # 行索引
df.columns # 列索引
df.values # 对象值,二维ndarray数组
DataFrame整体情况查询
df.head(3) # 显示头部几行,默认5行
df.tail(3) # 显示末尾几行,默认5行
df.info() # 相关信息概览:行数,列数,列索引,列非空值个数,列类型,列类型,内存占用
df.describe() # 咐速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值
3、排序方法
df.sort_values(by="Count_AnimalName",ascending=False)
对于 df 的dataframe数据结构按照Count_AnimalName索引进行排序
df = df.sort_values(by="Count_AnimalName",ascending=False)
a = df.head(10)
按照这种方式取出 df 的按照Count_AnimalName索引排序后前10位的数据元素
4、dataframe数据引用、索引和切片
1、按照索引名Count_AnimalName排序后,取前100的数据
df_sorted = df.sort_values(by="Count_AnimalName")
df_sorted[:100]
2、取某一列数据
df["Count_AnimalName"]
3、取前100行数据中Count_AnimalName列的数据
df[:100]["Count_AnimalName"]
[说明]:一般行没有名称,列有名称,如果有行名称的话可仿照取列数据的方式取用数据
5、优化后的提取数据函数
1、df.loc 通过标签索引行数据
--df.loc['a', 'W'] # 取出 'a' 行,'W' 列的数据
--df.loc['a', ['W','Y', 'Z']] # 取出 'a'行,'W','Y', 'Z'列数据
--df.loc['a', :] # 取出 'a' 行数据
--df.loc[:, ['W','Y', 'Z']] # 取出 'W','Y', 'Z' 列数据
--df.loc['a':'c', ['W','Y', 'Z']] # 取出 'a'到'c' 行,'W','Y', 'Z' 列数据
这里 'a'到'c' 行切片是闭合的,意思是取的到'c'行,和正常的切片不同
2、df.iloc 通过位置获取行数据
--df.iloc[1:3, [2, 3]] # 取出1到3行中,2、3两列的数据
--df.iloc[1:3, 4:7] # 取出1到3行中,4到7列的数据
6、pandas中nan不需要使用astype转化数据类型,因为函数自动会帮忙转化,在numpy中需要手动转化
7、布尔索引
df.[df['Count_AnimalName']>800] # 选择df中'Count_AnimalName'索引下值大于800的值
df.[(df['Count_AnimalName']>800)&(df['Row_labels'].str.len()<100)]
8、pandas之字符串操作方法
cat 实现元素級的字符串连接操作,可指定分隔符
contains 返回表示各字符串是否含有指定模式的布尔型数组
count 模式的出现次数
endswith, startswith 相当于对各个元素执行 x.endswith(pattern)和x.startswith(pattern)
findall 计算各字符串的模式列表
get 获取各元素的第i个字符
join 根据指定的分隔符将Series中各元素的字符串连接起来
len 计算各字符串的长度
lower, upper 转换大小写,相当于对各个元素执行x.lower()或x.upper()
match 根据指定的正则表达式对各个元素执行re.match
pad 在字符串的左边、右边或左右两边添加空白符
center 相当于 pad(side='both')
repeat 重复值。例如,s.str.repeat⑶相当于对各个字符串执行X*3
replace 用指定字符串替换找到的模式
slice 对Series中的各个字符串进行子串截取
split 根据分隔符或正则表达式对字符串进行拆分
strip rstrip lstrip 去除空白符,包括换行符。相当于对各个元素执行x.strip()、x.rstrip()、x.lstrip()
9、缺失数据处理
1、numpy中处理nan: 先检查出nan,在替换为均值或者中值
2、pandas中处理nan: (numpy中nan不能进行计算,pandas中可以进行计算)
1、判断是否为nan
判断数据是否为NaN:pd.isnull(df),pd.notnull(df)
2、处理nan数据
处理方式1:删除NaN所在的行列dropna(axis=0, how='any', inplace=False)
axis: 为0表示按照行 | 为1表示按照列
how参数:any表示只要有一个nan就删除(默认是any) | all表示全部为nan才进行删除
inplace参数:
处理方式2:填充数据,
t.fillna(t.mean()) --填充均值
t.fiallna(t.median()) --填充中值
t.fillna(0) --填充一个数字:0
填充可以单独对某一列(或者是行)进行操作,因为不是每一列的nan都是数字,都可以填充,也不是每一列都可以求均值的
像电话号码、家庭住址等数据的缺失,nan不能使用均值等进行填充
t['age'] = t['age'].fillna(t['age'].mean()) # 对t数据的'age'列进行nan处理,填充进'age'这一列数据的均值
3、对于数据中的0处理
如果数据中的0非常确定是填充数据,补缺口使用的,可以是用
t[t==0] = np.nan # 进行替换
例如:家庭住址中有个0,电话号码有个0这样的可以换为nan | 像点击数等不需要,因为不确定
0和nan最大的区别就是:0参与运算,但是nan不参与运算
3、读取外部数据
1、读取csv文件
pd.read_csv('../numpy/csv/dogNames2.csv')
2、读取mysql数据库文件
pd.read_sql(sql_sentence,connection)
3、读取mongodb数据库
4、pandas中常见统计数据
1、如果希望输出结果不再折叠可以使用
使用pd.set_option(pat, value)的模式可以设置各种样式
pd.set_option('display.max_columns', 1000) # 设置最大输出列为1000
pd.set_option('display.max_rows', 500) # 设置最大输出行为500
pd.set_option('display.height', 1000) # 设置输出窗口高度为1000
pd.set_option('display.width', 1000) # 设置输出窗口宽度为1000
至于行数据不需要设置,因为输出太多本来就是符合实际要求,而列数据有利于我们观察数据类型,便于我们方便作出进一步分析因此有必要设置
有的时候一行包含太多列,不能再一行中完全输出一列展示在console中,会使用\进行连接console中属于一列的两行数据
2、不重复统计
1、set函数:相当于建立一个集合不允许重复,就是有重复也只算一个,很好地用于某些统计中
len(set(df.['列名'].tolist()))
2、df.unique():使用unique函数也可以达到set不重复统计的目的
len(df.['列名'.unique()])
3、把二维数组拉平成一维数组
1、列表推导式
num_acs = data['Actors'].str.split(', ').tolist()
actors = [i for j in num_acs for i in j]
print(len(set(actors)))
这里是用列表推导式循环取出data中'Actors'这一列,切分字符串后形成的二维数组中的数据
pandas中data['Actors']只是一个Series,而不是string所以不能直接调用split(),必须转换
2、使用flatten函数
必须先使用np.array(num_acs)转为numpy.ndarray(即使num_acs已经为list类型)
【注意事项:但不是每次都能完全拉平和维度有关系】
5、数据的合并
1、join函数
A.join(B) # 按照行进行合并
合并时按照A的行作为依据,如果A的行大于B,B中缺失行填充NAN
如果A的行小于B,B中多余的行被截断不计入
2、merge函数
df1 和 df3两个data数据块,df1含有a、b、c、d四列,df3含有f、a、x三列
1、merge函数默认为inner,取交集
df1.merge(df3, on='a')
取df1和df3中,按照某一列'a'进行拼接,且只拼接df1和df3有公共值的那一行
2、连接方式(和数据库中的连接很像)
默认的合并方式inner,交集
merge outer,并集,NaN补全
df1.merge(df3, on='a', how='outer') # 以两者为准,对于彼此都不具有的补充为NAN
merge left,左边为准,NaN补全
df1.merge(df3, on='a', how='left') # 以左边为准,a这一列的df1有则都显示,df1没有则不显示
merge right,右边为准,NaN补全
df1.merge(df3, on='a', how='right') # 以右边为准,a这一列的df3有则都显示,df3没有则不显示
3、除了使用 表1.merge(表2, on='a', how='right')形式外
pd.merge(表1, 表2, on=['表2待合并列名', '表2待合并列名'], how='合并方式')
6、分组和聚合
1、使用grouped = df.groupby(by='索引名称'),返回对象是DataFrameGroupBy对象,是可迭代的
grouped中的每一个元素是一个元组, 元组里面是(索引(分组的值),分组之后的DataFrame)
1、按照一个索引进行分组
group_by = data.groupby(by='Country')
2、按照多个索引进行分组
group_by = data['Brand'].groupby(by=[data['Country'], data['State/Province']]).count()
如果是对一列数据(Series类型)进行分组,需要使用by=[data['Country'], data['State/Province']]这种写法,将分割条件单独分开
df.groupby(by=["Country","State/Province"])["Country"].count()
如果是对多列数据(DataFrame类型,而不是)进行分组,直接可以写by=["Country","State/Province"]
3、对2中结果进行改进,让data['Brand']返回结果是DataFrame类型,而不是Series类型
data['Brand']中[['Brand']]加上一个[]即可,相当于告诉ide我使用的是多个查询,但只传入一个条件,[['Brand']]位置可以放置在多个位置
[ex]:
--group_by = data[['Brand']].groupby(by=[data['Country'], data['State/Province']]).count()
--group_by = data.groupby(by=[data['Country'], data['State/Province']])[['Brand']].count()
--group_by = data.groupby(by=[data['Country'], data['State/Province']]).count()[['Brand']]
2、grouped(DataFrameGroupBy对象)能够调用的一般对象方法
count 分组中非NA值的数量
sum 非NA值的和
mean 非NA值的平均值
median 非NA值的算术中位数
std, var 无偏(分母为n-1)标准差和方差
min、max 非NA值的最小值和最大值
7、索引和复合索引
1、简单的索引操作:
--获取index: df.index
--指定index : df.index = ['x','y']
--重新设置index : df.reindex(list("abcedf"))
--指定某一列作为index : df.set_index("Country",drop=False)
设置为:drop=False,表示将"Country"这一列设置为索引后不删除该列,默认是删除的(为True)
--返回index的唯一值: df.set_index("Country").index.unique()
这个方法说明:设置一列作为索引后,会出现索引重复的情况,这里就是只取不重复索引的情况
a为一个DataFrame,那么当a.set_index(["c","d"])即设置两个索引,即一个DataFrame结构中拿出两列作为索引是可以的
8、pandas时间序列
1、时间序列生成
pd.date_range(start=None, end=None, periods=None, freq='D')
--start和end以及freq配合能够生成start和end范围内以频率freq的一组时间索引
--start和periods以及freq配合能够生成从start开始的频率为freq的periods个时间索引
[ex]:
pd.date_range(start='20130112', end='20130212', freq='10D')
每隔10天生成一次日期:DatetimeIndex(['2013-01-12', '2013-01-22', '2013-02-01', '2013-02-11'], dtype='datetime64[ns]', freq='10D'),这里10D不仅可以设置为D,还可以加上数字
pd.date_range(start='20130112', periods=5, freq='10D')
每隔10天,起始日期为:20130112,一共生成5个
按年对数据进行聚合,计算方式依然为求和。
按年对数据进行聚合,计算方式依然为求和。
loandata['loan_amnt'].resample('M',how=sum).fillna(0)
将贷款金额字段按月聚合后求和,并用0填充空值。
loandata[['loan_amnt','total_rec_int']].resample('M',how=[len,sum])
分别对'loan_amnt'和'total_rec_int'按月聚合,并进行求和和计数计算
loandata['2016-01':'2016-05'].resample('M',how=sum).fillna(0)
对2016年1月至5月的数据按月进行了聚合,并计算求和。用0填充空值。
loandata[loandata['loan_amnt']>5000].resample('M',how=sum).fillna(0)
对于贷款金额大于5000的按月进行聚合,并计算求和。空值以0进行填充。
2、日期形式
W 星期
D Day 每日历日
B BusinessDay 每工作曰
H Hour 每小时
T或min Minute 每分
S Second 每秒
L或ms Milli 每毫秒(即每千分之一秒)
U Micro 每微秒(即每百万分之一秒)
A 每年
Q 按季度的最后一天切割,相当于每季度,可仿照下面有 BQ QS BQS等
M MonthEnd 每月最后一个日历曰,相当于每月
BM BusinessMonthEnd 每月最后一个工作日
MS MonthBegin 每月第一个日历日
BMS BusinessMonthBegin 每月第一个工作曰
3、生成一个以日期为索引的dataframe
index=pd.date_range("20170101",periods=10)
df = pd.DataFrame(np.random.rand(10),index=index)
1、生成一个索引从20170101开始,一共十个日期,以此为索引建立dataframe数据块
4、使用函数将 含有日期的字符串 转换为 时间序列
回到最开始的911数据的案例中,我们可以使用pandas提供的方法把时间字符串转化为时间序列:
--df["timeStamp"] = pd.to_datetime(df["timeStamp"],format="")
--format参数大部分情况下可以不用写,但是对于pandas无法格式化的时间字符串,我们可以使用该参数,比如包含中文
5、重采样
重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程,
--将高频率数据转化为低频率数据为降采样,
--低频率转化为高频率为升采样
pandas提供了一个resample的方法来帮助我们实现频率转化
[ex]:
count_by_month = data.resample("M").count()['title']
resample中参数就是日期形式
真的不行了或者很难找到原因,可以使用 dir(变量名) 的方式打开其所能够调用的所有方法和属性,通过分析可以试着进行处理变量
6、rolling()函数及其系列
1、DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)
--window:表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。
如果是offset类型,表示时间窗的大小。pandas offset相关可以参考这里。
--min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等。对于offset类型,默认为1。
--freq:从0.18版本中已经被舍弃。
--center:是否使用window的中间值作为label,默认为false。只能在window是int时使用。
--win_type:窗口类型,默认为None一般不特殊指定,了解支持的其他窗口类型,参考这里。
--on:对于DataFrame如果不使用index(索引)作为rolling的列,那么用on来指定使用哪列。
--closed:定义区间的开闭,曾经支持int类型的window,新版本已经不支持了。对于offset类型默认是左开右闭的即默认为right。
可以根据情况指定为left both等。
--axis:方向(轴),一般都是0。
2、rolling_count 计算各个窗口中非NA观测值的数量
pandas.rolling_count(arg, window, freq=None, center=False, how=None)
--arg : DataFrame 或 numpy的ndarray 数组格式
--window : 指移动窗口的大小,为整数
--freq :
--center : 布尔型,默认为False, 指取中间的
--how : 字符串,默认为“mean”,为down- 或re-sampling
3、rolling_sum 移动窗口的和
pandas.rolling_sum(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
--arg : 为Series或DataFrame
--window : 窗口的大小
--min_periods : 最小的观察数值个数
--freq :
--center : 布尔型,默认为False, 指取中间的
--how : 取值的方式,默认为None
4、以下为移动窗口系列汇总
rolling_mean 移动窗口的均值
pandas.rolling_mean(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
rolling_median 移动窗口的中位数
pandas.rolling_median(arg, window, min_periods=None, freq=None, center=False, how='median', **kwargs)
rolling_var 移动窗口的方差
pandas.rolling_var(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
rolling_std 移动窗口的标准差
pandas.rolling_std(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
rolling_min 移动窗口的最小值
pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs)
rolling_max 移动窗口的最大值
pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs)
rolling_corr 移动窗口的相关系数
pandas.rolling_corr(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None)
rolling_corr_pairwise 配对数据的相关系数,等价于: rolling_corr(…, pairwise=True)
pandas.rolling_corr_pairwise(df1, df2=None, window=None, min_periods=None, freq=None, center=False)
rolling_cov 移动窗口的协方差
pandas.rolling_cov(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None, ddof=1)
rolling_skew 移动窗口的偏度(三阶矩)
pandas.rolling_skew(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
rolling_kurt 移动窗口的峰度(四阶矩)
pandas.rolling_kurt(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)
rolling_apply 对移动窗口应用普通数组函数
pandas.rolling_apply(arg, window, func, min_periods=None, freq=None, center=False, args=(), kwargs={})
rolling_quantile 移动窗口分位数函数
pandas.rolling_quantile(arg, window, quantile, min_periods=None, freq=None, center=False)
rolling_window 移动窗口
pandas.rolling_window(arg, window=None, win_type=None, min_periods=None, freq=None, center=False, mean=True, axis=0, how=None,
**kwargs)
ewma 指数加权移动
ewma(arg[, com, span, halflife, ...])
ewmstd 指数加权移动标准差
ewmstd(arg[, com, span, halflife, ...])
ewmvar 指数加权移动方差
ewmvar(arg[, com, span, halflife, ...])
ewmcorr 指数加权移动相关系数
ewmcorr(arg1[, arg2, com, span, halflife, ...])
ewmcov 指数加权移动协方差
ewmcov(arg1[, arg2, com, span, halflife, ...])