相关篇:

一、数据选取

按索引标签 选取(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的高级用法(三)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐