pandas和Series使用

Series

由数组和列表创建Series是一个浅拷贝(只拷贝引用地址,不拷贝对象本身)对象数值变化,数组也变

  • from pandas import Series
    • 引入Series
  • Series([1,2,3,4,5],index=list("abcde"))
    • 创建和索引
  • Series({"a":1,"b":2,"c":3})
    • 由字典创建
  • s.values
    • 显示值
  • s.index
    • 显示索引
  • s[]
    • 按字典索引
  • s.ix
    • 显示隐式都可
  • s.loc
    • 显示索引
  • s.iloc
    • 隐式索引
  • s.size
    • 大小
  • s.shape
    • 形状
  • pd.read_csv("./titanic.txt")
    • 读取csv文件
  • 变量名.head(3)
    • 前几条
  • 变量名.tail(10)
    • 最后几条
  • pd.isnull()
    • 判断是否为空
  • pd.notnull()
    • 判断是否为空

DataFrame

dic = {
    "姓名":["狗蛋","刘德华","鹿晗","TF","张柏芝","谢霆锋"],
    "语文":[120,130,140,110,110,100],
    "数学":[130,110,100,100,100,120],
    "外语":[120,130,123,125,112,143],
    "综合":[230,240,254,234,100,100] 
}
df = DataFrame(dic,index=list("abcdef")) 

创建DataFrame

  • df.columns
    • 横索引
  • df.index
    • 纵索引
  • df2.add(df1,fill_value=0)
    • fill_value参数在补用它的值去填补缺失的地方
    • (注意)原来既缺行又缺列的仍然补nan
  • df.cumsum()
  • ue.groupby(["contb_receipt_dt","party"])[["contb_receipt_amt"]].sum().unstack(level=1).cumsum().cumsum()
    • 分完组之后累计求和
Python Operator Pandas Method(s)
+ add()
- sub(), subtract()
* mul(), multiply()
/ truediv(), div(), divide()
// floordiv()
% mod()
** pow()

Series与DataFrame之间的运算

- 使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)
- 使用pandas操作函数:
    - axis=0:以列为单位操作(参数必须是列),对所有列都有效。
    - axis=1:以行为单位操作(参数必须是行),对所有行都有效。
  • df2.add(s_row,axis=1)

    • df2中的与s_row同样的一行里面数值进行相加。
  • np.nan(NaN)

  • np.nan(NaN)

    • np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
    • 但可以使用np.nan*()函数来计算nan,此时视nan为0。
    • pandas中None与np.nan都视作np.nan
  • np.nansum(nd)

    • 视nan为0之后求和。
  • pandas中None与np.nan的操作

  • df.isnull()

    • 判断是否为空,按照dataframe形式显示
  • df.notnull()

    • 与上述相反
  • df.isnull().all(axis=0)

    • 判断每一列中的所有元素是否全为True,如果是则为True
  • df.isnull().any(axis=0)

    • 判断每一列中是否有为True的元素,如果有一个为True,则为True
  • df.dropna(axis=1,how="any")

    • axis 0 默认,代表操作行 1 代表操作列
    • how "any"默认只要有缺失就丢弃 "all"所有的都缺失才丢掉
  • df.fillna(1000)

    • 直接填补为nan的
  • df.fillna(method="bfill",axis=0)

    • 拿后面的行标对应的值填充到前面的nan位置
  • df.fillna(method="ffill",axis=0)

    • 拿前面的行标对应的值填充到前面的nan位置
  • 隐式构造

  • s = Series(data=[100,98,89,90],
    index=[["张三","张三","李四","李四"],["期中","期末","期中","期末"],
    ["a","b","a","b"]])
    s

    • Series也可以创建多层索引
  • df = DataFrame(data=[100,98,89,90],
    index=[["张三","张三","李四","李四"],["期中","期末","期中","期末"],
    ["a","b","a","b"]],
    columns = ["python"]
    )
    df

    • DataFrame隐式构造
  • 显示构造pd.MultiIndex

  • mindex =pd.MultiIndex.from_arrays([["a",'a','a','b','b','b'],
    ['一单元',"二单元","三单元",'一单元',"二单元","三单元"]])
    mindex

    • 使用数组
  • mindex = pd.MultiIndex.from_tuples([("河南","郑州"),
    ("河南","洛阳"),
    ("山东","济南"),
    ("河北","石家庄"),
    ("北京","天安门"),
    ("四川","成都"),
    ("江苏","南京")])

    • 注意:每个元组代表一个行(或列)的索引名,索引名要用元组的元素来体现
      mindex
    • 使用tuple
  • mindex = pd.MultiIndex.from_product([["河南","山东"],['郑州','济南']])
    mindex

    • 使用product

索引的堆

  • df1.stack(level=1)
    • 使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
  • df.unstack(level=2)
    • 使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。

过滤

  • df.where(df>50,other=0)
    • 这个函数是根据条件来过滤,并将不符合的改成0

级联

  • pd.concat([df1,df2])
    • 和np.concatenate一样,优先增加行数(默认axis=0)
  • pd.concat([df1,df2],axis=1)
    • 增加列数
    • 注意index在级联时可以重复
    • 也可以选择忽略ignore_index,重新索引
    • 不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致(通俗的讲就是级联完了索引是1231234这种,并不是启用统一的级联)
  • pd.concat([df1,df2],keys=["教学","品保"])
    • 使用多层索引 keys
  • pd.concat([df1,df3],axis=0,join="outer")
    • 外连接
    • 1、不匹配级联在外连接的模式下要求如果axis=0行级联列索引必须保持一致
    • axis=1列级联行索引必须保持一致
    • 2、如果不一致缺哪个索引就补全哪个索引
  • pd.concat([df1,df3],axis=0,join="inner")
    • 内连接:只连接匹配的项
    • 内连接在级联的时候不一致的地方全部丢弃
  • pd.concat([df1,df4,df5],axis=1,join_axes=[df1.index])
    • 连接指定轴

合并

  • df1.merge(df3)
    • 使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
  • df1.merge(df5,on="name",suffixes=["实际","假的"])
    • 如果两个表有多个相同的属性,需要指定以哪一个属性为基准来合并
  • df1.merge(df6,left_on="name",right_on="姓名")
    • 如果两个表没有相同的属性,可以左边的表出一个属性,右边的表出一个属性,然后进行合并
    • 这种合并两个属性不能并在一起
  • df1.merge(df6,right_index=True,left_index=True)
    • 用索引来合并
  • df1.merge(df7,how="inner")
    • 内合并:只保留两者都有的key(默认模式)
  • df1.merge(df7,how="outer")
    • 外合并 how='outer':补NaN
  • df1.merge(df7,how="right")
  • df1.merge(df7,how="left")
    • 左和并:以左侧为基准,左侧有右侧没有补nan,左侧没有右侧有去掉
    • 有合并:和上面相反

删除重复元素

  • df.duplicated()
    • 返回值为一个Series记录着每一行的重复情况,如果某一行不是第一次出现就认为他是重复
    • 返回是否重复的bool值
  • df.drop_duplicates(inplace=True)
    • 删除重复数据

映射

  • df.replace({"red":"blue","green":20},inplace=True)
    • 把字典的键替换成值
  • df["h5"].map(lambda x : x-40)
    • 按照函数来替换
  • df.rename(columns={"外语":"English"},index=func)
    • 替换索引

异常值检测和过滤

  • df.describe()
    • 显示个数,平均数,标准差,最大值等信息

排序

  • np.random.permutation()
    • 函数随机排序(随机打乱)
  • df.take([1,0,1])
    • 按索引提取,一般与上个函数一起用
  • ue.sort_values(by=["contb_receipt_dt"])
    • 按照值排序
  • data.sort_index(axis=1,ascending=False)
    • 按照索引降序排列

数据聚合

  • price_mean = df.groupby(["item"])[["price"]].mean()
    • 分组后,按照组进行求和,平均等操作
  • price_mean.round(2)
    • round让结果在输出的保留几位小数
  • df.groupby(["color"]).transform(sum)
    • 高级数据聚合(显示样式有区别)
  • df.groupby(["color"]).apply(sum)
    • 高级数据聚合(显示样式有区别)
  • 转换日期类型

  • pd.to_datetime(ue["contb_receipt_dt"])
    • 从字符串类型转到日期类型

推荐阅读更多精彩内容