赞
踩
相关篇:
按索引标签 选取(loc做法)
按索引位置 选取(iloc做法)
.loc
df2.loc[0]
返回的是seriesdf2.loc[[0]]
返回的是DataFrame
.iloc
df2.iloc[0]
返回的是seriesdf2.iloc[[0]]
返回的是DataFrame
.loc
df2.loc[1:4]
切片数据最后一个取不到,所以要加1df2_name.loc["c":"i"]
之前写的df2.loc[1:4]能返回第2行到第5行的数据,只是恰好因为索引号是默认生成的数值索引;
本质与df2_name.loc["c":"i"]
是一样的,都是代表索引标签,而不是位置
.iloc
df2.iloc[1:5]
末端数值代表第几行
.loc
df2_name.loc[["a","h","z","d"]]
#注意是双括号
.iloc
df2_name.iloc[[1,3,6,9]]
取对应的位置
df2["站点编号"]
返回series数据
df2[["站点编号"]]
返回dataframe数据
.loc
df2.loc[:,"借车总量"]
返回series数据
df2.loc[:,["借车总量"]]
返回dataframe数据
冒号: 表示所有行
.iloc
df2.iloc[:,[1]]
输入位置即可
df2.借车总量
返回series数据
优点:写法比较简单快捷;
缺点:如果列名和关键字重复了就无法提取了,因为点号调用的是对象,python无法判断出名字一样的列名和关键字
.loc
df2_name.loc[:,"借车总量":"站点状态"]
连续列,需要切片
.iloc
df2_name.iloc[:,1:5]
第1列到第5列
(选取“借车总量”,“自行车存量”,“站点空桩”)
df2_name[["借车总量","自行车存量","站点空桩"]]
选取的是表格型数据,必须双括号呢
.loc
df2_name.loc[:,["借车总量","自行车存量","站点空桩"]]
.iloc
df2_name.iloc[:,[1,3,6]]
(选取第3行到第8行,“借车总量”到“自行车存量”数据
.loc
df2_name.loc["c":"s","借车总量":"自行车存量"]
.iloc
df2_name.iloc[2:8,1:4]
ifo_new.loc[i,"size"]=5
而不能用
ifo_new.loc[i]["size"]=5
因为.loc[i]
选取是一行,返回这一行,再选择‘size’列对应的值。
选取出借车总量小于10的所有数据
.loc[]
df2["借车总量"]<10
逻辑判断得到布尔值
df2.loc[df2["借车总量"]<10]
筛选出数据
.query()
df2.query("借车总量<10")
省略df的步骤
取出借车总量小于10且还车数据小于40的的所有数据,并且只要站点编号,借车总量,还车量
.loc
df2.loc[(df2["借车总量"]<10)&(df2["还车总量"]<40),["站点编号","借车总量","还车总量"]]
两个条件用圆括号扩起来,中间用过且&,或|,
可以引入变量
.query()
df2.query("借车总量<10&还车总量<40")[["站点编号","借车总量","还车总量"]]
双方括号选多列
函数中不能引入变量,例如:a=10,"借车总量<a"就会报错
选取leixin1中为A的所有数据
.loc
df2.loc[df2["leixing1"]=="A"]
双等号为判断
.isin()
df2["leixing1"].isin(["A"])
是否函数 返回布尔值
df2.loc[df2["leixing1"].isin(["A"])]
.query()
df2.query("leixing1=='A'")
里面用了外面用了双引号,里面用了单引号
指2层或2层以上的索引
有时候需要通过多个维度来查看数据
以字符串列作为索引时,要保证这列为字符串格式 用.astype('str')
保证
df3[["leixing1","leixing2"]]=df3[["leixing1","leixing2"]].astype("str")
.set_index()
创建具有2重索引的数据 .set_index()
df3_index=df3.set_index(["leixing1","leixing2"])
==参数介绍 ==
是指该列被指定为索引后,是否删除该列,默认为True,即为删除该列.如果改成False,则多重索引也在数据集的列中也会保留
df3_index=df3.set_index([“leixing1”,“leixing2”],drop=False)
指定是否保留原索引,默认为False,即不修改,如果改成True,则保留源索引
df3_index=df3.set_index([“leixing1”,“leixing2”],append=True)
指是否在源数据的基础上修改,默认为False,即不修改,返回一个新的数据框,如果改成True,则直接在源数据上修改
.get_level_values()
.get_level_values()
df3_index.index.get_level_values(0)
获取第一层索引
df3_index.index.get_level_values(1)
获取第二层索引
.swaplevel()
.swaplevel()
df3_index.swaplevel()
先对数据源的索引进行升序排列
.sort_index
df3_index.sort_index(inplace=True)
如果没有对索引进行升序排序的话,在多重索引选取数据的过程中无法通过切片选取数据 ,切片是由小到大选取的,
例如字符串a->z,数字0->100,所以在对索引升序后,才能正确的切片选取数据
df3_index.loc["A","p"]
第一索引为“A”,第二索引为“p"
df3_index.loc[slice("B","D")]
通过切片"B"到“D”选取数据根据第一索引
df3_index.loc[(slice("B","D"),'p'),:]
第一索引为切片“B”到“D”,第二索引为“p",
slice(None)
df3_index.loc[(slice(None),"p"),:]
第一索引全部选取,第二索引选取p
df3_index.loc[(slice(None),["p","1"]),"站点编号":"自行车存量"]
第一索引全部选取,第二索引选取“p"和“1”,列选取切片”站点编号“到”自行车存量“之间的列
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
根据键对数据进行分组,常见的键类型 有2种:
- 根据列在分组
- 根据索引来分组
对应每个组应用函数,类型有三种
- aggregation:聚合,对每个组计算统计值
- transformation:转换,对每个组进行特殊计算,例如在组内标准化数据
- filtration:过滤,对组进行条件过滤,根据条件判断得到的布尔值,丢弃掉一些组
将计算好的组整合到一个数据结构中
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对组进行条件过滤
.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”作为索引,按照索引来实现分组计算(根据索引分组计算)
未完
通过参考相关博客对hdf5格式简要介绍。
hdf5在存储的是支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的。 使用压缩可以提磁盘利用率,节省空间。 开启压缩也没有什么劣势,只会慢一点点。 压缩在小数据量的时候优势不明显,数据量大了才有优势。 同时发现hdf读取文件的时候只能是一次写,写的时候可以append,可以put,但是写完成了之后关闭文件,就不能再写了, 会覆盖。
另外,为什么单独说pandas,主要因为本人目前对于h5py这个包的理解不是很深入,不知道如果使用该包存pd.DataFrame格式的文件,不像numpy格式文件可以直接存储,因此只能依赖pandas自带一些函数进行处理。
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’,打开文件时使用的模式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校验和class HDFStore
下的其他函数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中。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格式。HDFStore.get(key)
检索存储在文件中的pandas对象HDFStore.select(key, where=None, start=None, stop=None, columns=None, iterator=False, chunksize=None, auto_close=False)
检索存储在文件中的pandas对象,可以选择根据where条件。HDFStore.info()
print 关于store的详细信息,返回strHDFStore.keys(include='pandas')
返回与存储在HDFStore中的对象相对应的键的列表。HDFStore.groups()
返回所有顶级节点的列表。返回的每个节点都不是pandas存储对象。HDFStore.walk(where='/')
遍历pandas对象的pytables组层次结构。该生成器将为每个组生成组路径,子组和pandas对象名称。任何不是组的非大熊猫PyTables对象都将被忽略的,其中基团本身被列为第一(前序),然后它的每个子组(以下字母数字顺序)也被遍历,按照相同的程序。# 导入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的高级用法(三)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。