import pandas as pd #Series 和 DataFrame 都是 Pandas库的数据结构,使用前要导入
一、 Series 简述、创建
 
  1. Series简述和创建 
  •         简述    
        Series 可以理解为一维数组, 其一个索引index对应一个值values; 也可以看做是定长的有序字典
         
  •         创建   
S = pd.Series(data, index= index)
            其中data数据类型可以有:  python dict 、numpy数组和常量
    
              A. python dict
                dict 的key做索引, values做索引对应的值
               B.  numpy
 
                C. 常量
 
  1. 操作:
            
  • 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
  1. 简述和创建
  •  简述:
            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也有,只是改了一些。
  1. 操作
 
  • 索引
  #返回一个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参数,根据一个或者多个列的值排序