核心数据结构

  1. Series一维带标签数组
"""Series 创建"""
# ndarray创建
series = pd.Series(np.random.randn(5),index=list("abcde"))  # index参数指定行标签,如未指定则采用系统默认值
# list创建
series = pd.Series([1,2,3,4,5],index=list("abcde"))
# dict创建
series = pd.Series(dict(a=10,b=20,c=30,d=40,e=50))
# scalar创建
series = pd.Series(6,index=list("abcde"))
"""属性和方法"""
print(series.index)  # 行标签
print(series.name)   # 对象名字
print(series.shape)  # 形状大小
print(series.dtypes) # 数据类型
print(series.values) # 数据
series.head(2) # 获取开头两行数据
series.tail(2) # 获取最后两行数据
series.describe() # 获取数据的统计描述
series.sort_values() # 按数据进行排序
series.reindex(new_indexs) # 重定义行索引
"""索引"""
# 类ndarray对象
print("series[0]:{0}".format(series[0]))
print("series[0:4]:{0}".format(series[0:4]))
# 类dict对象
print("series['a']:{0}".format(series["a"]))
print("a in series:{0}".format("a" in series))
print("series.get('a'):{0}".format(series.get('a')))
# 标签对齐
series1 = pd.Series(np.random.randn(6),index=list("abcdef"))
series2 = pd.Series(np.random.randn(5),index=list("acfgj"))
series1+series2
  1. DataFrame二维带标签数组
"""创建DataFrame对象"""
# 从二维ndarray数组创建
df = pd.DataFrame(np.random.randn(6,4),index=list("ABCDEF"),columns=["one","two","three","four"])
# 从字典创建
df = pd.DataFrame(dict(A=list(range(6)),B=list(range(1,7)),C=list(range(2,8))),index=list("abcdef"))
# 从结构化数据中创建
df = pd.DataFrame([[1,2,3,4],[2,3,4,5],[3,4,5,6]])
df = pd.DataFrame([(1,2,3,4),(5,6,7,8)],index=list("AB"),columns=["one","two","three","four"])
df = pd.DataFrame([{"A":1,"B":2},{"A":2,"B":4}])
# 从Series对象创建
df = pd.DataFrame(series,index=list("abcde"))
"""属性和方法"""
df.index # 获取行标签
df.columns # 获取列标签
df.pop() # 弹出某列
del df[col] # 删除某列
df.insert() # 插入某列
df.assign() # 调用函数插入某列
df.reindex() # 重定义标签,可通过index/columns参数指定重定义行或列标签
df.drop() # 丢弃数据 可传入列表丢弃多行或多列,axis参数指定丢弃行或列"""索引"""
df[col] # 以列标签索引某列
df.loc[lable] # 以行标签索引某行
df.iloc[index_label] # 以行位置索引某行,可多行索引
df[bool_vector] # 以布尔向量选择为True的行,向量长度与行数相等
df.swaplevel() # 交换索引
df.sortlevel() # 索引排序
# 标签对齐
df1+df2 # 相同行列标签的数据会执行+操作,不同行列操作直接扩展拼接
  1. Panel三维带标签数组(使用较少,详情查手册)

索引

  1. 层次化索引
    层次化索引可以使数据在一个轴上有多个索引级别。即以二维方式表达高维数据,使数据组织方式更清晰。
"""Series多层索引"""
a = [['a', 'a', 'a', 'b', 'b', 'c', 'c'], [1, 2, 3, 1, 2, 2, 3]]
tuples = list(zip(*a))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) # index为生成的多重索引对象
s = pd.Series(np.random.randn(7), index=index) # 数据实现多重索引
s.index.levels[0] # 取出第一层索引
"""DataFrame多层索引"""
df = pd.DataFrame(np.random.randint(1, 10, (4, 3)), index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],   # 行多层索引columns=[['one', 'one', 'two'], ['blue', 'red', 'blue']])  # 列多层索引
"""索引交换及排序"""
df.swaplevel(name1,name2) # 交换两个name1及name2对应的索引层
df.sortlevel(0) # 对指定索引层排序
df.sum(level=0) # 按指定索引层进行统计
"""索引与列的转换"""
df.set_index(cols) # 将指定的一列列设置为索引
df.reset_index() # 重置行索引

基础运算

df.apply() # 将数据按行或列进行运算,axis参数指定行或列
df.applymap() # 逐元素运算
df.sort_values() # 指定按某列数据进行排序
df.sort_index() # 按列标签进行排序
series.unique() # 输出唯一成员,类似于集合
series.value_counts() # 对值进行计数,统计每个值出现的次数
series.isin() # 判断每个值是否在给定序列中

分组计算

"""对Series分组"""
df[col].groupby(df[col1]) # 通过col1的数据对col进行分组
df[col].groupby([df[col1],df[col2]])
"""对DataFrame分组"""
df.groupby(col) # 通过列标签col对df进行分组
df.groupby([col1,col2])
"""获取分组元素个数"""
df.groupby([col1,col2]).size()
"""对分组进行迭代"""
for name,group in df.groupby(col):print(name)print(group)
"""将分组转化为字典"""
dict(list(df.groupby(col)))
"""按列分组"""
df.groupby(df.dtypes,axis=1)
"""通过字典分组"""
df.groupby(dict(col1="red",col2="red",col3='blue',col4='blue'),axis=1) # 按列标签将数据分为red和blue两组
"""按索引级别分组"""
columns = pd.MultiIndex.from_arrays([['China', 'USA', 'China', 'USA', 'China'],['A', 'A', 'B', 'C', 'B']], names=['country', 'index'])
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
df.groupby(level='country', axis=1)  # 按一级索引,也就是country进行分组
"""分组重置索引index"""
df.groupby(col).reset_index()
df.groupby(col,as_index=False)

聚合计算

"""内置聚合函数"""
df.groupby(df.col).sum()    # 对组内元素求和
df.groupby(df.col).min()    # 对组内元素取最小值
df.groupby(df.col).max()    # 对组内元素取最大值
df.groupby(df.col).mean()   # 对组内元素取平均值
df.groupby(df.col).std()    # 对组内元素求标准差
df.groupby(df.col).describe() # 获取组内元素的统计描述
"""自定义聚合函数"""
def peak(s):return s.max() - s.min()
df.groupby(df.col).agg(peak) # 将函数名传入agg()作为参数即可
"""应用多个聚合函数"""
df.groupby(df.col).agg(['mean','std',peak])  # 应用mean(),std(),自定义的peak()函数
"""给聚合后的列取名"""
df.groupby(df.col).agg([('mean','col_mean'),('std','col_std'),(peak,'col_peak')])  # 将函数和对应的名字以元组的形式传递即可,即(function,name)
"""对不同列应用不同的聚合函数"""
df.groupby([col1,col2]).agg(dict(col1=['mean',peak],col2=['sum','std']))  # 以字典作为参数即可,字典的键表示相应的列

分组运算和转换

# 分组运算包括“拆分-应用-合并”
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],'key2': ['one', 'two', 'one', 'two', 'one'],'data1': np.random.randint(1, 10, 5),'data2': np.random.randint(1, 10, 5)})
"""给每行添加一个以key1分组后的平均值"""
k1_mean = df.groupby('key1').mean().add_prefix('mean_')
pd.merge(df, k1_mean, left_on='key1', right_index=True)
"""transform简化处理"""
k1_mean = df.groupby('key1').transform(np.mean).add_prefix('mean_')
df[k1_mean.columns] = k1_mean
"""距平化(与平均值的差值)"""
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=['a', 'b', 'c', 'd', 'e'], index=['Alice', 'Bob', 'Candy', 'Dark', 'Emily'])
def demean(s):return s - s.mean()key = ['one', 'one', 'two', 'one', 'two']
demeaned = df.groupby(key).transform(demean)
"""apply函数(逐行或逐列处理数据)"""
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a', 'a', 'a', 'b', 'b', 'a'],'key2': ['one', 'two', 'one', 'two', 'one', 'one', 'two', 'one', 'two', 'one'],'data1': np.random.randint(1, 10, 10),'data2': np.random.randint(1, 10, 10)})
# 根据 column 排序,输出其最大的 n 行数据
def top(df, n=2, column='data1'):return df.sort_values(by=column, ascending=False)[:n]
df.groupby('key1').apply(top,n=3,column="data2")

数据导入导出


时间日期


数据可视化


创建数据对象

"""创建数据对象"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline  # 设置inline风格,用于内嵌显示
# 创建Series对象:类似一维数组
data = pd.Series([1,2,3,np.nan,5,6])
# 创建DataFrame对象:类似二维数组
date = pd.date_range("20200608",periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=date,columns=list("ABCD"))
df = pd.DataFrame(dict(A=1,\B=pd.Timestamp("20200608"),\C=list(range(4)),\D=np.arange(5,9),\E="text",\F=list("AABBCCDD")))
df.values # 获取所有数据
df.dtypes # 获取每列数据的类型
df.A # 获取A列的数据,A是Series类型
df.shape # 查看对象形状
df.head(n) # 查看开头的n行数据
df.tail(n) # 查看末尾的n行数据
df.index # 获取数据的行标签
df.colums # 获取数据的列标签
df.describe() # 获取数据的统计摘要描述
df.T # 将数据转置,类似矩阵转置
df.sort_index(axis=1,ascending=False) # 对列标签按降序排列排序(不对数据排序,数据会跟随标签移动)
# axis指定按行标签0还是列标签1排序,ascending指定了排序是升序True还是降序False
df.sort_values(by="C")   # 按某列数据进行排序(标签跟随数据移动)
"""数据访问:标签访问"""
df.loc["20200608"]        # 按行标签选择整行数据
df.loc[:,"A"]             # 按列标签选择整列数据
df.loc["20200608":"20200612","A":"B"] # 按行列标签范围选择数据
df.loc["20200608":"20200610",["A","C"]] # 按行范围的指定列标签选择数据
df.loc["20200608","A"]  # 按行标签和列标签选择某个数据
df.at[pd.Timestamp("20200608","A")] # 功能与前一行的loc相同,但对于标签必须指定具体的数据类型
"""数据访访问:位置访问"""
df.iloc[1] # 选择指定位置行的数据
df.iloc[:,1] # 选择指定位置列的数据
df.iloc[1:5,1:3] # 选择指定位置范围的数据
df.iloc[1,1] # 选择指定位置的数据
df.iat[1,1] # 同上
"""布尔索引"""
df[df > value] # 索引全部符合要求的数据,对不符合要求的数据用NaN表示
df[df.A > value] # 索引当前列所有符合要求的行
df[df.F.isin(["A","C"])] # 索引指定列包含相应数据分行
"""处理丢失数据"""
# pandas使用numpy.NaN 表示丢失数据,它不参与计算
df.dropna(axis=0,how="any") # 用于移除包含NaN的行或列,不改变原有数据
df.fillna(value=5,method=None) # 用指定方法或固定值填充NaN,二者不能同时指定
pd.isnull(df) # 判断哪些值时NaN,返回对象与df等大小,数据为布尔值
df.mean() # 求均值,可指定按行或列进行
df.sum() # 求和,可指定按行或列进行
df.sub() # 求差,可指定按行或列进行
df.cumsum() # 累积求和,可指定行列进行
df.apply(func) # 可将列作为参数传递给指定函数
df.iloc[0].value_counts() # 统计某行或某列据的重复次数
df.iloc[0].mode() # 对某行或某列进行排序
"""数据合并"""
pd.concat([df.iloc[0],df.iloc[2:4],df.iloc[6]]) # 合并多个子表,可指定按行或列
pd.merge() # 执行数据库风格的合并
df.append(df.iloc[0]) # 将某个dataframe/series/list/dict追加到后面
"""分组统计"""
df.groupby("A").sum() # 按A列的值进行分组,统计求和
df.groupby(["A","B"]).sum() # 先按A列的值分组,再按B列的值分组,统计求和
index = pd.MultiIndex.from_tuples(tuples,names=["first","second"]) # 设置多重行标签或列标签
df.stack() # 将最底层列标签转换为行标签
df.unstack() # 将最底层行标签转换为列标签
"""数据透视"""
pd.pivot_table(df,values="A",index=["D","E"],columns=["C"]) # value为需要透视的列数据,index为透视选择的行标签,columns为透视选择的列标签
"""时间序列"""
pd.date_range("20200609",periods=600,freq="s")
pd.period_range(start=pd.Period('2017Q1', freq='Q'),end=pd.Period('2017Q2',freq='Q'),freq='M')
df.resample("2Min",how="sum")  # 按时间间隔进行从采样,采样方式为求和"""类别数据"""
df["grade"] = df["D"].astype("category")  # 为某列数据添加类别
df["grade"].cat.categories = ["goog","very good"] # 改变类别的值,如对类别数据将按照原有数据排序
"""数据读写"""
df.to_csv("data.csv")  # 将数据写入到CSV文件
df = pd.read_csv("data.csv",index_col)  # 将数据从CSV文件中读取

Pandas数据分析相关推荐

  1. pandas 数据分析 相关性_探索 COVID-19 新冠数据来学习 Pandas

    来源:python中文社区 本文约2100字,建议阅读6分钟. 使用 pandas 数据分析工具来学习一些基本的 pandas 命令,并探索数据集中包含的内容. 欧洲疾病预防控制中心(https:// ...

  2. pandas数据分析选则接近数值的最接优方案

    import numpy as np import pandas as pd# pandas数据分析选则接近数值的最接优方案# 1.准备数据 CHILD_TABLE = (720, 750) CHID ...

  3. Pandas数据分析——Task2

    练习题 Ex1:口袋妖怪数据集 现有一份口袋妖怪的数据集,下面进行一些背景说明: #代表全国图鉴编号,不同行存在相同数字则表示为该妖怪的不同状态 妖怪具有单属性和双属性两种,对于单属性的妖怪,Type ...

  4. Pandas数据分析groupby函数深度总结(1)

    Pandas数据分析groupby函数深度总结(1) groupby分组数据 加载数据 数据分组 按'Sales Rep'列分组 显示所有分组 选择一个特定的组 计算每组中的行数 按'Sales Re ...

  5. pandas数据分析给力教程【完整版】(七)

    Pandas绘图 上一篇:pandas数据分析给力教程[完整版](六) Series和DataFrame都有一个用于生成各类图表的plot方法.默认情况下,它们所生成的是线形图 线形图 简单的Seri ...

  6. Pandas数据分析案例(盛华化工锅炉排放数据可视化分析)

    Pandas数据分析案例(盛华化工锅炉排放数据可视化分析) 实验环境 数据集介绍 问题描述 实验步骤 一.数据导入与观察 二.数据转换 三.数据可视化分析 相关资源 实验环境 操作系统:Linux/W ...

  7. Pandas数据分析实战01--Abalone Data Set(鲍鱼数据集)

    Pandas数据分析实战01 1. 数据描述 2. 数据读取 3. 数据呈现 4. 数据分析 打算从基础开始学习数据分析,给自己一个整理内容和学习消化的时间,所以,这也将成为我的学习笔记. 1. 数据 ...

  8. CC00038.python——|HadoopPython.v02|——|Arithmetic.v02|Pandas数据分析库:Pandas数据结构|

    一.pandas数据分析库 ### --- pandas数据分析库~~~ Python在数据处理和准备⽅⾯⼀直做得很好,但在数据分析和建模⽅⾯就差⼀些. ~~~ pandas帮助填补了这⼀空⽩,使您能 ...

  9. pandas数据分析给力教程【完整版】(五)

    pandas的拼接操作 上一篇:pandas数据分析给力教程[完整版](四) 下一篇:pandas数据分析给力教程[完整版](六) pandas的拼接分为两种: 级联:pd.concat, pd.ap ...

  10. Pandas数据分析—groupby分组统计

    13.Pandas中groupby分组统计 文章目录 13.Pandas中groupby分组统计 前言 一.分组使用聚合函数做数据统计 1.准备数据 二.遍历groupby的结果理解执行流程 三.实例 ...

最新文章

  1. 你想了解的Cookie和Session就在这~
  2. 使用hibernate与mysql时数据不能插入的原因及解决办法
  3. 「机器学习」到底需要多少数据?
  4. Exchange/Office365 自动处理脚本:环境准备篇(一)
  5. 题目1164:旋转矩阵
  6. 小白科普:虚拟化简史
  7. 【WebGoat笔记】--- Cross-Site Scripting(XSS)
  8. STL-String源码分析
  9. js中split()和join()的用法
  10. 前端学习(2744):重读vue电商网站54之配置 HTTPS 服务
  11. leetcode242. 有效的字母异位词
  12. 猎豹浏览器怎么收藏网页 网页收藏方法简述
  13. Acoustica 7 Premium Edition for Mac(音频处理软件) v7.3.28
  14. linux下sock_raw和sock_stream读取缓存的区别
  15. 华为和谷歌在全球开发者眼里二选一,谁会获得胜利?
  16. 果你的浏览器关闭了 java,weblogic之CVE-2018-3191漏洞分析
  17. ArcGIS Maritime Server 开发教程(三)Maritime Service 功能解读
  18. Windows进程间各种通信方式浅谈(转)
  19. 用R语言实现信息度量
  20. 微软的软件下载,MSDN下载(方便,无广告,仅提供下载)

热门文章

  1. 学习日志2:ARM开发板—触摸屏
  2. 转盘抽奖脚本html,js抽奖转盘实现方法分析
  3. 快快网络融合CDN是什么
  4. 【python】if __name__==‘__mian__‘ 如何理解,原理及作用
  5. 计算机网络存储设备有哪些,存储设备有哪些
  6. android rar文件怎么打开方式,rar文件手机上怎么打开 手机怎么打开zip文件
  7. 计算机组装拆卸 心得,学习组装电脑的心得体会怎么写?
  8. python如何导入excel表格_使用Python读取电子表格中的数据
  9. 树莓派HDMI转VGA线有无源
  10. 爬虫小程序 - 周杰伦歌曲