相关篇:

  • DataFrame数据处理(一)
  • dataframe高级用法三

一、数据选取

按索引标签 选取(loc做法)

按索引位置 选取(iloc做法)

1.1选取第1行的数据(选取单行数据)

.loc

  • df2.loc[0]
    返回的是series
  • df2.loc[[0]]
    返回的是DataFrame

.iloc

  • df2.iloc[0]
    返回的是series
  • df2.iloc[[0]]
    返回的是DataFrame

1.2选取第2到5行的数据(选取连续行数据)

.loc

  • df2.loc[1:4]
    切片数据最后一个取不到,所以要加1
  • df2_name.loc["c":"i"]
    之前写的df2.loc[1:4]能返回第2行到第5行的数据,只是恰好因为索引号是默认生成的数值索引;
    本质与df2_name.loc["c":"i"]是一样的,都是代表索引标签,而不是位置

.iloc

df2.iloc[1:5]
末端数值代表第几行

1.3选取第2,4,7,10行的数据(选取特定行数据)

.loc

df2_name.loc[["a","h","z","d"]]#注意是双括号

.iloc

df2_name.iloc[[1,3,6,9]]取对应的位置

1.4选取单列数据

  • df2["站点编号"]

返回series数据

  • df2[["站点编号"]]

返回dataframe数据

  • .loc

df2.loc[:,"借车总量"]返回series数据
df2.loc[:,["借车总量"]]返回dataframe数据
冒号: 表示所有行

  • .iloc

df2.iloc[:,[1]]输入位置即可

  • 点号选取法

df2.借车总量
返回series数据

优点:写法比较简单快捷;
缺点:如果列名和关键字重复了就无法提取了,因为点号调用的是对象,python无法判断出名字一样的列名和关键字

1.5选取连续列数据

.loc

df2_name.loc[:,"借车总量":"站点状态"]
连续列,需要切片

.iloc

df2_name.iloc[:,1:5]
第1列到第5列

1.6选取特定列数据

(选取“借车总量”,“自行车存量”,“站点空桩”)

  • 方括号+列名

df2_name[["借车总量","自行车存量","站点空桩"]]
选取的是表格型数据,必须双括号呢

  • .loc

df2_name.loc[:,["借车总量","自行车存量","站点空桩"]]

  • .iloc

df2_name.iloc[:,[1,3,6]]

1.7选取部分行部分列数据

(选取第3行到第8行,“借车总量”到“自行车存量”数据
.loc

df2_name.loc["c":"s","借车总量":"自行车存量"]

.iloc

df2_name.iloc[2:8,1:4]

1.8 修改某个特定的值


ifo_new.loc[i,"size"]=5

而不能用

ifo_new.loc[i]["size"]=5

因为.loc[i]选取是一行,返回这一行,再选择‘size’列对应的值。

二、数据筛选

2.1单条件不等式筛选

选取出借车总量小于10的所有数据
.loc[]

df2["借车总量"]<10
逻辑判断得到布尔值
df2.loc[df2["借车总量"]<10]
筛选出数据

.query()

df2.query("借车总量<10")
省略df的步骤

2.2多条件不等式筛选

取出借车总量小于10且还车数据小于40的的所有数据,并且只要站点编号,借车总量,还车量
.loc

df2.loc[(df2["借车总量"]<10)&(df2["还车总量"]<40),["站点编号","借车总量","还车总量"]]
两个条件用圆括号扩起来,中间用过且&,或|,
可以引入变量

.query()

df2.query("借车总量<10&还车总量<40")[["站点编号","借车总量","还车总量"]]
双方括号选多列
函数中不能引入变量,例如:a=10,"借车总量<a"就会报错

2.3等式筛选

选取leixin1中为A的所有数据

  • .loc

df2.loc[df2["leixing1"]=="A"]
双等号为判断

  • .isin()

df2["leixing1"].isin(["A"])
是否函数 返回布尔值
df2.loc[df2["leixing1"].isin(["A"])]

  • .query()

df2.query("leixing1=='A'")
里面用了外面用了双引号,里面用了单引号

三、多重索引

.3.1什么是多重索引

指2层或2层以上的索引
有时候需要通过多个维度来查看数据

3.2利用字符串创建多重索引

以字符串列作为索引时,要保证这列为字符串格式 用.astype('str')保证

df3[["leixing1","leixing2"]]=df3[["leixing1","leixing2"]].astype("str")

3.3 利用.set_index() 创建具有2重索引的数据

.set_index()

df3_index=df3.set_index(["leixing1","leixing2"])

==参数介绍 ==

  • drop=

是指该列被指定为索引后,是否删除该列,默认为True,即为删除该列.如果改成False,则多重索引也在数据集的列中也会保留
df3_index=df3.set_index([“leixing1”,“leixing2”],drop=False)

  • append=

指定是否保留原索引,默认为False,即不修改,如果改成True,则保留源索引
df3_index=df3.set_index([“leixing1”,“leixing2”],append=True)

  • inplace=

指是否在源数据的基础上修改,默认为False,即不修改,返回一个新的数据框,如果改成True,则直接在源数据上修改

3.4 获取索引 .get_level_values()

.get_level_values()

df3_index.index.get_level_values(0)获取第一层索引
df3_index.index.get_level_values(1)获取第二层索引

3.5 交换索引 .swaplevel()

.swaplevel()

df3_index.swaplevel()

四、通过多重索引来选取数据

1. 切片前的索引排序

先对数据源的索引进行升序排列
.sort_index

df3_index.sort_index(inplace=True)
如果没有对索引进行升序排序的话,在多重索引选取数据的过程中无法通过切片选取数据 ,切片是由小到大选取的,
例如字符串a->z,数字0->100,所以在对索引升序后,才能正确的切片选取数据

4.2 通过多重索引选取数据

df3_index.loc["A","p"]
第一索引为“A”,第二索引为“p"

4.3 通过切片进行单索引选取数据

df3_index.loc[slice("B","D")]
通过切片"B"到“D”选取数据根据第一索引

4. 4 通过切片进行多重索引

df3_index.loc[(slice("B","D"),'p'),:]
第一索引为切片“B”到“D”,第二索引为“p",

4.5 取某一索引列下的全部数据

slice(None)

df3_index.loc[(slice(None),"p"),:]
第一索引全部选取,第二索引选取p

4.6. !!多重索引,并选取部分列的数据

df3_index.loc[(slice(None),["p","1"]),"站点编号":"自行车存量"]
第一索引全部选取,第二索引选取“p"和“1”,列选取切片”站点编号“到”自行车存量“之间的列

4.7 利用xs函数通过level指定索引,然后选取数据

  • df3_index.xs("A",level=0)
    选取第一索引列即类型为“A”的所有数值
  • df3_index.xs("p",level=1)
    选取第2索引列即类型为“p"的所有数值
  • df3_index.xs("p",level=1,drop_level=False)
    选取第2索引列即类型为“p"的所有数值 ,并且保留第2索引列
  • df3_index.xs(("A","p"),level=(0,1))
    选取第1索引列为“A",第2索引为“p"的所有数据,注意不能选多个
  • df3_index.xs(("A","p"),level=["leixing1","leixing2"])
    level也可以是索引列名

五、 数据汇总


8.1分组计算

何为分组计算?

小精灵会有多个分类,比如有火系的,草系的,那么分组计算就是值:将不同类别的小精灵归入到不同的组,例如火系的一组,这样我们就得到了很多个组,然后对这些组去实现不同的计算,例如求每一个组的攻击力的平均值,这样我们就得到了每一个组他们自身组内的攻击力均值了

如何分组计算?

.groupby

分组计算流程:spilt-apply-combine

  1. spilt(拆分)

根据键对数据进行分组,常见的键类型 有2种:

  • 根据列在分组
  • 根据索引来分组
  1. apply(应用)

对应每个组应用函数,类型有三种

  • aggregation:聚合,对每个组计算统计值
  • transformation:转换,对每个组进行特殊计算,例如在组内标准化数据
  • filtration:过滤,对组进行条件过滤,根据条件判断得到的布尔值,丢弃掉一些组
  1. combine(合并)

将计算好的组整合到一个数据结构中

8.1.1如何单列分组,单列计算?
.groupby

df3.groupby(“leixing1”)[[“还车总量”]].mean()
根据“leixing1"分组统计每组“还车总量”的平均值

8.1.2如何多列分组,单列计算?
.groupby

df3.groupby([“leixing1”,“leixing2”])[[“还车总量”]].mean()
根据“leixing1"和"leixing2"联合分组统计每组“还车总量”的平均值

8.1.3如何多列分组,单列计算多个函数?
.agg()

gr=df3.groupby([“leixing1”,“leixing2”])
gr[[“还车总量”]].agg([np.mean,np.median,np.sum])
多个函数要用[]扩起来

8.1.4如何多列分组,多列计算不同 函数?
.agg

gr=df3.groupby([“leixing1”,“leixing2”])
gr.agg({“借车总量”:[np.mean,np.median],“还车总量”:np.sum})
借用字典的方式对应

8.1.5对组内数据进行标准化处理(转换)
.transform

数据标准化
zscore=lambda x :(x-x.mean())/x.std()
gr.transform(zscore)

8.1.6对组进行条件过滤

针对gr分组,希望得到平均还车辆20以上的组,其余的组过滤掉

.filter

attack_filter=lambda x :x[“还车总量”].mean()>20
gr.filter(attack_filter)
gr.filter(attack_filter).groupby([“leixing1”,“leixing2”]).mean()[[“还车总量”]]
gr.filter(attack_filter).groupby([“leixing1”,“leixing2”])[[“还车总量”]].mean()
验证

8.1.7将“类型1”“类型2”作为索引,按照索引来实现分组计算(根据索引分组计算)

未完

9. ‘写入’‘读取’hdf文件

9.1. 引言

通过参考相关博客对hdf5格式简要介绍。
hdf5在存储的是支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的。 使用压缩可以提磁盘利用率,节省空间。 开启压缩也没有什么劣势,只会慢一点点。 压缩在小数据量的时候优势不明显,数据量大了才有优势。 同时发现hdf读取文件的时候只能是一次写,写的时候可以append,可以put,但是写完成了之后关闭文件,就不能再写了, 会覆盖。
另外,为什么单独说pandas,主要因为本人目前对于h5py这个包的理解不是很深入,不知道如果使用该包存pd.DataFrame格式的文件,不像numpy格式文件可以直接存储,因此只能依赖pandas自带一些函数进行处理。

9.2读取 函数pandas.read_hdf()

pandas.read_hdf(path_or_buf, key=None, mode='r', errors='strict', where=None, start=None, stop=None, columns=None, iterator=False, chunksize=None, **kwargs)
参数解析:

  • path_or_bufstr: str,路径对象,pandas.HDFStore或类似文件的对象
  • key:store中的组表示。如果hdf中只有一个pandas对象,则可以省略
  • mode:{‘r’,‘r +’,‘a’},默认为’r’,打开文件时使用的模式
    具体参考链接read_hdf的解释

9.3 写入 函数 pandas.HDFStore

类 HDFStore()
HDFStore(path,mode=None,complevel=None,complib=None,fletcher32=False,**kwargs)
参数解析:

  • path:str,HDF5文件的路径
  • mode:{‘a ’ ,‘w’ ,‘r’ ,‘r+’},默认‘a’
  • complevel:int,0-9,默认none,指定数据的压缩级别
  • complib:{‘zlib’, ‘lzo’, ‘bzip2’, ‘blosc’},默认’zlib’,指定要使用的压缩库
  • fletcher32:bool,默认False,如果应用压缩,请使用fletcher32校验和

9.4 class HDFStore下的其他函数

  1. HDFStore.put(key, value, format=None, index=True, append=False, complib=None, complevel=None, min_itemsize=None, nan_rep=None, data_columns=None, encoding=None, errors='strict', track_times=True, dropna=False)将对象存储在HDFStore中。
  2. HDFStore.append(key, value, format=None, axes=None, index=True, append=True, complib=None, complevel=None, columns=None, min_itemsize=None, nan_rep=None, chunksize=None, expectedrows=None, dropna=None, data_columns=None, encoding=None, errors='strict') 添加到文件中的Table。节点必须已经存在并且是Table格式。
  3. HDFStore.get(key)检索存储在文件中的pandas对象
  4. HDFStore.select(key, where=None, start=None, stop=None, columns=None, iterator=False, chunksize=None, auto_close=False) 检索存储在文件中的pandas对象,可以选择根据where条件。
  5. HDFStore.info() print 关于store的详细信息,返回str
  6. HDFStore.keys(include='pandas') 返回与存储在HDFStore中的对象相对应的键的列表。
  7. HDFStore.groups()返回所有顶级节点的列表。返回的每个节点都不是pandas存储对象。
  8. HDFStore.walk(where='/')遍历pandas对象的pytables组层次结构。该生成器将为每个组生成组路径,子组和pandas对象名称。任何不是组的非大熊猫PyTables对象都将被忽略的,其中基团本身被列为第一(前序),然后它的每个子组(以下字母数字顺序)也被遍历,按照相同的程序。

9.5 案例

# 导入pandas和numpy库
import pandas as pd
import numpy as np
# 生成9000000条数据
a=np.random.standard_normal((9000000,4))
b=pd.DataFrame(a)
# 普通格式存储
h5=pd.HDFStore('test_ordinary','w')
h5['data']=b
h5.close()
# 压缩格式存储
h55=pd.HDFStore('test_compression','w',complevel=4,comlib='blosc')
h55['data']=b
h55.close()
# 读取数据
data=pd.read_hdf('test_ordinary',key='data')

上一篇:dataframe的基础用法(一)
下一篇:dataframe的高级用法(三)

【pandas】--DataFrame数据筛选(二)相关推荐

  1. pandas DataFrame数据筛选和切片

    DataFrame数据筛选--loc,iloc,ix,at,iat 条件筛选 单条件筛选 选取col1列的取值大于n的记录: data[data['col1']>n] 筛选col1列的取值大于n ...

  2. Python中pandas.Dataframe数据筛选

    Dataframe可以实现强大的数据筛选功能,下面简单举几个例子: # 创建一个DataFrame import pandas as pd import numpy as np df = pd.Dat ...

  3. DataFrame 数据筛选

    pandas DataFrame 数据筛选 DataFrame 数据筛选 数据筛选基本格式 contains isin 多个条件与或 数据筛选进阶 groupby agg np.where DataF ...

  4. Python Pandas 行数据筛选方法汇总

    Pandas 行数据筛选 一.准备数据 二.通过逻辑规则筛选(大于/小于等) 三.删除重复元素 三.显示最前面 / 最后面的 n 行 3.1 显示前面 n 行 3.2 显示后面 n 行 四.随机抽取 ...

  5. Python Pandas 列数据筛选方法汇总

    Pandas 列数据筛选方法汇总 数据准备: 一.筛选得到指定的列 1.1 根据 label 选择特定的几列 1.2 选择单列的两种方式 1.3 通过正则表达式选择列 二.同时对 行 和 列 进行筛选 ...

  6. pandas dataframe数据聚合groupby、agg、privot基于sum统计详解及实例

    pandas dataframe数据聚合groupby.agg.privot基于sum统计详解及实例 知道了sum.那么min.max.mean.median都是举一反三的事情了. 在日常的数据分析中 ...

  7. pandas DataFrame数据取出两列

    pandas DataFrame数据取出两列 最常用的是以下两种方式 最常用的是以下两种方式 df = pd.DataFrame(df,columns=['feater','predict'])# 或 ...

  8. pandas DataFrame数据重命名列名的几种方式

    文章目录 前言 一 部分列重命名 二 全部列重命名 三 str 批量修改列名 四 读取csv文件重命名 后记 前言 首先,我们创建一个5行4列的DataFrame数据作为示例,进行演示 import ...

  9. python pandas DataFrame 数据替换

    python pandas DataFrame 替换 import pandas as pd import numpy as np df1 = pd.DataFrame({'日期': ['2021-7 ...

最新文章

  1. c/c++ 如何输入带空格的字符串
  2. auto关键字详解 C++
  3. YOLOv3最全复现代码合集(含PyTorch/TensorFlow和Keras等)
  4. 记录之关于tensoflow中使用Adam优化算法导致模型保存时参数的变化的记录
  5. Rust学习资料大全
  6. Asp.Net Core 2.1+的视图缓存(响应缓存)
  7. ACL20 Best Paper揭晓!NLP模型评价体系或将迎来重大转折
  8. php如何用session做查询条件,php如何使用session?
  9. 前端遮罩层实现_cocos creator--游戏开奖功能组件《刮刮卡》特效实现
  10. [转]Windows 性能监视器工具-perfmon
  11. java url 传值乱码问题_java 页面url传值中文乱码问题解决
  12. 数字信号处理实验一 T3
  13. 发明,还是发现?数学本质的哲学之辩
  14. 企业微信推送suite_ticket对接
  15. OC语言学习——继承和多态的一些随笔记
  16. (load和initialize)不要被你的log迷惑了你对问题的判断
  17. Android中的UI组件
  18. java按成绩排序_JAVA中按分数高低对同学进行排序二维数组
  19. 21个经典故事,值得收藏
  20. linux lp命令,Linux lp 命令 command not found lp 命令详解 lp 命令未找到 lp 命令安装 - CommandNotFound ⚡️ 坑否...

热门文章

  1. vscode报错Failed to save ***,The content of the file is newer.
  2. MySQL 8.0 物理备份xtrabackup简介
  3. JS console.log()的理解
  4. 家用计算机中PCB板材质,主流的PCB板材料有哪些分类?
  5. 简述计算机动画制作流程,Mg动画制作流程——六大步骤
  6. 通过瑞利判据对显微镜物镜进行分辨率研究
  7. 移植vsftpd FTP服务器到ARM-Linux系统
  8. Delphi Sender对象的使用
  9. pythonsze_python学习笔记二 数据类型(基础篇)
  10. rhel centos 源_Rhel centos 7的fips脚本