import pandas as pd #Series 和 DataFrame 都是 Pandas库的数据结构,使用前要导入
一、 Series 简述、创建
-
Series简述和创建
-
简述
Series 可以理解为一维数组, 其一个索引index对应一个值values; 也可以看做是定长的有序字典
-
创建
S = pd.Series(data, index= index)
其中data数据类型可以有: python dict 、numpy数组和常量
A. python dict
dict 的key做索引, values做索引对应的值
B. numpy
】
C. 常量
-
操作:
-
Series部分属性
index和values属性
import pandas as pd data = ['jordan', 'james', 'kobe'] se1 = pd.Series(data, index=range(3)) print se1.index print se1.values
name属性, 索引的name属性
se1.name = 'rank_number' se1.index.name = 'num' se1.index = ['No1', 'No.2', 'No.3'] #修改索引
-
Series部分方法
pd.isnull() # 检查是额否有NaN(缺失值),返回一个Series,数据为boolean
# 排序: pd.Series.sort_index() # 按照索引排序 pd.Series.order() # 按 值 排序, 有任何缺失值时,放到Series尾部
-
索引、切片
se2 = pd.Series(np.arange(5), index = list('apple')) se2['p'] # 索引, 索引值为'p'的都会列出来 se2['a':'l'] # 切片, 与Python和numpy切片不同, Series “非数值” 切片是 “包前又包后的”(满嘴顺口溜也考不上研!!Doge) se2[: 3] #切片, 通过数值切片依旧是 “包前不包后”
-
重新索引
Series的reindex方法重新索引, 由下图看出来reindex方法是复制了原始的Series,并没有改变原始数据
se1 = pd.Series(['a', 'aa', 'aaa'], index=[1,2,3]) se1.reindex([1,2,3,4]) # 当索引对应的数据为空时,默认NaN填充 se1.reindex(['1','2','3','4']) # 当改变索引的数据类型时 int -> string 时,对应数据也会改变 se1.reindex([1,2,3,4],fill_value=0) # fill_values参数,设置缺失值 # 还有几种缺失值填充的参数: # ffill / pad # 向前填充/搬运 值 # bfill / backfill # 向后填充/搬运 值
二、DataFrame
-
简述和创建
-
简述:
DataFrame是一种含有行索引、列索引的表格类型的数据结构, 其每列都是不同的值类型。
-
创建:
A. 单层字典创建:
import pandas as pd play_info = { "name": ['jordan', 'james', 'kobe', 'johnson', 'shark'], 'club': ['Bulls', 'Heat', 'Lakers', 'Lakers', 'Lakers'], 'position':['sg', 'sf', 'sg', 'pg', 'c'], 'number': ['23', '6', '24', '32', '33'] } p_df = pd.DataFrame(play_info) # 未指定index行索引,默认添加有序索引; 如果没有指定column列索,那么列序是随机。如下图所示; # 若创建DataFrame时, play_info 中的数据有缺失值, 会自动使用NaN填充,这就不举例了 print p_df p_df = pd.DataFrame(play_info, columns=['name', 'number', 'club', 'position']) # 指定列索引columns顺序 p_df = pd.DataFrame(play_info, columns=['name', 'number', 'club', 'position'], index=['one', 'two', 'three', 'four', 'five']) #显示指定行索引
B. 嵌套字典创建:
data2 = { 'nevada' : { 2001 : 2.4, 2002 : 2.9 }, 'ohio':{ 2000 : 1.5, 2001 : 1.7, 2002 : 3.6 } } df1 = pd.DataFrame(data2) # 嵌套字典创建,没有显示指定index时, 内层字典 的key 会被合并、排序 print df1
C. 先创建DataFrame数据,再使用 index和columns属性指定
DataFrame.index = [] # 增加行索引 / 修改行索引 DataFrame.columns = [] # 增加列索引 / 修改列索引 (如下图就是修改行、列索引)
-
属性:
name属性
df.index.name = df.columns.name = df.values # 返回 DataFrema的数据为 ndarray类型
-
DataFrame() 构造函数可以接收的数据类型
2nd- array | 数据矩阵 |
数组、列表和元组组成的字典 |
字典每个key在DataFrame中为一列
|
numpy的结构化数组 |
类似“数组组成的字典”
|
Series组成的字典
|
每个Series在DataFrame中为一列,未显示之指定索引,会合并
|
字典组成的字典(嵌套字典, 如上例所示)
|
每个内层字典成为一列,内层字典的key被合并,行列索引未指定则合并 |
字典或Series的列表
|
各项成一行。 字典key/ series索引的并集 成为DataFrame 的 columns
|
由列表/元组组成的列表
|
类似 2nd-array |
另一个 DataFram
|
该DataFrame 的index未显示指定时, 沿用
|
Numpy的 MaskedArray
|
类似 2nd-array, 只是掩码值在结果DataFrame中成为缺失值 NaN
|
上述表格在《利用Python进行数据分析》P123页也有,我只是改了一部分(按我的理解)
-
索引对象
DataFrame的索引对象不支持修改,保证了多个数据结构之间的安全共享
index对象还有多个
Index
广义的Index,由Python object组成的numpy数组
|
Int64Index
整数数组特殊的Index
|
MultiIndex
“层次化”索引对象
|
DatetimeIndex
时间戳,Numpy的datetime类型表示
|
PeriodIndex
时间间隔数据的特殊Index
|
注:上述表格《利用Python进行数据分析》P125也有,只是改了一些。
-
操作
-
索引
#返回一个Series p_df['name'] # 如下第一个图 #如下图2 DataFrame.iloc[int_num] # 行索引数据类型为 int 时,使用iloc 。 int_num为索引整数值 (基于数字) DataFrame.loc['str'] # 列索引数据类型为 string 时,使用loc。 str为索引具体的值 (基于字符串) #如下图3 DataFrame.ix[[rows_index], [col_index]] # ix 基于标签索引,
索引其他方法
reindex方法 |
1/多个轴匹配到新索引
|
xs方法
|
通过标签选取单行/单列,返回Series |
icol、irow方法
|
整数位置选取单行/单列,返回Series
|
get_value、set_values
|
根据行标签、列标签 选取/设置 单个值
|
注:表格来源于《利用Python进行数据分析》P132~P133的部分内容
图1
图2
-
切片与过滤
p_df[:2] p_df[['name', 'age', 'club']] # 多列 p_df[p_df['age'] > 28] # 过滤, p_df 的 ‘age’列大于28的所有整行数据
-
增加列
p_df['age'] = [26, 31, 32, 21, 27] # 顺序指定 p_df['country'] = 'usa' # 整体赋值
-
删除
del p_df['country'] # 删除列 DataFrame.drop(row_index) # 删除行,行索引的值为row_index
-
重新索引 与 删除索引及其行数据
pd.DataFrame().reindex(columns=[]) # reindex函数,传入 columns 参数值可以完成 列索引的重新索引,这就不举例了 df2 = pd.DataFrame(np.arange(9).reshape((3,3)), index=['a', 'c', 'd'], columns=['sss', 'aaa','ddd']) df3 = df2.reindex(['a', 'b', 'c', 'd']) print df3 df4 = df3.drop('a') / df4 = df3.drop(['a', 'c']) # 删除指定的行索引及其对应行数据(传入list就是多行)
reindex时, 新增索引对应的行没有对应值,NaN自动填充
-
算术运算、运算中的值填充
DataFrame之间的运算
# 相加有两种,add函数 和 + df1.add(df2, fill_values=) # add 函数完成运算 , fill_value 参数填充 缺失值 df1 + df2 # 行索引不相同时,相加后,整行都是NaN填充 # 相加后的DataFrame 可以使用 reindex 重新索引 ,fill_value 参数填充 # 其他函数 df.sub # 减法 df.div # 除法 df.mul # 乘法 Series + DataFrame # 注: series 和DataFrame 的数据类型 必须为int!! float和string 无法运算 # dataframe + series 运算本质 可以理解为 ,在DataFrame 中增加一个列,columns中为增加 df11 = pd.DataFrame(np.arange(12).reshape((4,3)), index=list('abcd'),columns=['no1', 'no2', 'no3']) se1 = pd.Series(np.arange(5), index=list('abcde')) add_df_se = df11.T + se1 # series.index 与 DataFrame.columns 存在关系时(子集、交集等),其含义是 在DataFrame 中增加一个列,columns中为增加 add_df_se = df11 + se1 # 如果某个值在DataFrame的列和Series的index中都找不到, 那么运算后的DataFrame 就会别重新索引 且生成并集
-
函数应用和映射
# 其主要是 如何在DataFrame中使用部分函数,如:min 、max、abs等灯
示例:
f = lambda x: x.max() - x.min() # 匿名函数 df11.apply(f) # 默认axis = 0 df11.apply(f, axis=1) # 这里的axis轴,表示行/列, axis = 0 表示列, axis = 1表示行
apply() 表示 沿着轴执行函数操作
-
其他功能
#内置排序 sort_index(self, axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None) # 具体参数 help()函数有介绍 , by参数,根据一个或者多个列的值排序