Pandas入门
来源:互联网 发布:装修得花多少钱 知乎 编辑:程序博客网 时间:2024/06/05 08:19
Series对象
Series可以用下标和索引标签存取元素。每个Series对象实际上都由两个数组组成:index:他是从ndarry数组继承的Index索引对象,保存标签信息。若创建Series对象时不指定index,将自动创建一个表示位置下标的索引。
- values:保存元素值得ndarry数组,Numpy的函数都对此数组进行处理。
import pandas as pdimport numpy as nps = pd.Series(np.arange(5), index=["a", "b", "c", "d", "e"])print u"索引", s.indexprint U"值数组", s.values索引 Index([u'a', u'b', u'c', u'd', u'e'], dtype='object')值数组 [0 1 2 3 4]print s[2]#支持位置和标签两种形式print s["c"]22print s[1:3]#支持切片,但标签切片同时包含起始标签和结束标签print s["b":"d"]b 1c 2dtype: int32b 1c 2d 3dtype: int32print s[[1, 3, 2]]#可以使用位置列表或位置数组存取元素print s[['a', 'b', 'c']]b 1d 3c 2dtype: int32a 0b 1c 2dtype: int32print list(s.iteritems())#同时具有数组和字典的功能[('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)]s2 = pd.Series([20, 30, 40, 50, 60], index=['b', 'c', 'd', 'e', 'f'])print s+s2#当两个Series对象进行操作符运算时,Pandas会按照标签对齐元#素,也就是运算操作符会对标签相同的两个元素进行计算,当某一方标签不存在#时,默认一Nan填充a NaNb 21.0c 32.0d 43.0e 54.0f NaNdtype: float641.基本用法
- Dataframe对象
import pandas as pddf_soil = pd.read_csv("C:\\WHO_first9cols.csv", index_col=[0])#index_col指定第一列为行索引print df_soil.dtypesprint df_soil.shapeprint df_soil.index #行索引print df_soil.columns #列索引print df_soil['CountryID'] #下标是单个标签时,所得到的是Series对象,print df_soil[['CountryID', 'Continent']] #下标是列表时,则得到一个新的DataFrame对象print df_soil.loc['Afghanistan'] #通过.loc可以获得行所对应的内容,单个为Series对象,多个位DataFrame对象print df_soil.values #将对象转换为数组,本例中类型不一致,统一转为object对象
2.将内存中数据转换为DataFrame对象,他的三个参数分别为data,index,columns分别为数据、行索引和列索引。
import pandas as pdimport numpy as npdf1 = pd.DataFrame(np.random.randint(0, 10, (4, 2)), index=['A', 'B', 'C', 'D'], columns=['a', 'b'])#将二维数组转换为df,行列通过index, columns指定df2 = pd.DataFrame({'a':[1, 2, 3, 4], "b":[5, 6, 7, 8]}, index=["A", "B", "C", "D"])#将字典转为df对象,列索引由键指定,行索引index指定arr = np.array([('item1', 1), ('item2', 2), ('item3', 3)], dtype=[("name", "10S"), ("count", int)])#将结构数组转换为df对象,其列索引由结构数组的字段名决定,行索引为默认从0开始的整数序列df3 = pd.DataFrame(arr)print df1print df2print df3 a bA 6 6B 9 5C 1 5D 2 8 a bA 1 5B 2 6C 3 7D 4 8 name count0 item1 11 item2 22 item3 3
此外还可以调用以from_开头的类方法,将特定格式的数据转换成DataFrame对象。
import pandas as pdimport numpy as npdict1 = {"a": [1, 2, 3], "b": [4, 5, 6]}dict2 = {"a": {"A": 1, "B": 2}, "b": {"A": 3, "C":4}}#orident指定字典键对应的方向,默认为"columns"df1 = pd.DataFrame.from_dict(dict1, orient="index")df2 = pd.DataFrame.from_dict(dict1, orient="columns")df3 = pd.DataFrame.from_dict(dict2, orient="index")#嵌套时第一重为指定的键,缺失值为NaNdf4 = pd.DataFrame.from_dict(dict2, orient="columns")print df1print df2print df3print df4items = dict1.items()'''将键值序列转换为DataFrame对象,其中值是表示一维数据的列表、数组或Series对象。当其中orient参数为index时,需要通过columns指定列索引。'''dfi1 = pd.DataFrame.from_items(items, orient='index', columns=["A", "B", "C"])dfi2 = pd.DataFrame.from_items(items, orient="columns") 0 1 2a 1 2 3b 4 5 6 a b0 1 41 2 52 3 6 A B Ca 1 2.0 NaNb 3 NaN 4.0 a bA 1.0 3.0B 2.0 NaNC NaN 4.0
3.将DataFrame转换为其他格式的数据
import pandas as pddict = {"a": {"A": 1, "B": 2}, "b": {"A": 3, "C":4}}df = pd.DataFrame.from_dict(dict, orient="columns")print dfprint u"字典列表", df.to_dict(orient="records")print u"列表字典", df.to_dict(orient="list")print u"嵌套字典", df.to_dict(orient="dict") a bA 1.0 3.0B 2.0 NaNC NaN 4.0字典列表 [{'a': 1.0, 'b': 3.0}, {'a': 2.0, 'b': nan}, {'a': nan, 'b': 4.0}]列表字典 {'a': [1.0, 2.0, nan], 'b': [3.0, nan, 4.0]}嵌套字典 {'a': {'A': 1.0, 'C': nan, 'B': 2.0}, 'b': {'A': 3.0, 'C': 4.0, 'B': nan}}
to_records()方法可以将DataFrame对象转为结构数组。
import pandas as pddict = {"a": {"A": 1, "B": 2}, "b": {"A": 3, "C":4}}df = pd.DataFrame.from_dict(dict, orient="columns")print dfprint u"字典列表", df.to_dict(orient="records")print u"列表字典", df.to_dict(orient="list")print u"嵌套字典", df.to_dict(orient="dict")
4.Index对象。Index对象保存索引标签数据,它可以快速找到标签对应的整数下标。
import pandas as pddict = {"a": {"A": 1, "B": 2}, "b": {"A": 3, "C":4}}df = pd.DataFrame.from_dict(dict, orient="columns")print dfindex = df.columnsprint index.values#index可以当做一维数组用print index[[1]]print index[index > 'a']#index对象也具有字典的映射功能,他将数组中的值映射到其他位置。print index.get_loc('a') #获取下标print index.get_indexer(['a', 'b']#index不可变,多个对象的索引可以有一个index提供 a bA 1.0 3.0B 2.0 NaNC NaN 4.0['a' 'b']Index([u'b'], dtype='object')Index([u'b'], dtype='object')0[0 1]
5.MultiIndex对象,多级索引,其中的多级标签采用元组对象表示。
import pandas as pdimport numpy as npclass1 = ["A", "A", "B", "B"]class2 = ["x", "y", "x", "y"]midx = pd.MultiIndex.from_product([["A", "B", "C"], ["x", "y"]], names=["class1", "class2"])#从多个集合的笛卡尔积创建MultiIndex对象。df = pd.DataFrame(np.random.randint(0, 10, (6, 6)), columns=midx, index=midx)print dfclass1 A B C class2 x y x y x yclass1 class2 A x 6 7 6 7 1 1 y 6 2 1 9 6 2B x 9 0 4 6 5 4 y 9 0 9 5 4 8C x 2 1 3 5 7 1 y 4 9 1 0 3 2
6.query()方法:当需要根据一定的条件进行过滤时,通常可以先创建一个布尔数组,使用该数组获取True对应的行。由于python中无法自定义not、and、or,因此需要改用~、&、!等位运算符。这些运算符优先级比比较运算符高,因此要加括号
df[(df.ph > 5) & (df.ca < 11))
使用query可以简化上诉程序:
fd.query("ph>5 and ca < 11") #可以使用and or not
7.文件读写
- csv文件
read_scv()文件的参数
- sep参数指定数据的分隔符号,默认使用逗号。有时CSV文件为便于阅读,在逗号后添加了一些空格以对齐数据。如果希望忽略可以将skipinitialspace参数设置为True.
- 如果数据使用空格或制表符分割,可以不设置sep参数,而将delim_whitespace参数设置为True.
- 默认情况下第一行文本被设置为列索引标签,如果数据文件没有保存列名的行,可以设置header参数为None.
- 如果数据文件前包含一些说明行,可以使用skiprows参数指定数据开始的行号。
- na_values、true_values和false_values等参数分别指定NaN、True、和False对应的字符串列表。
- io.BytesIO(string)可以将字符串包装成输入流。
- parse_dates可以将字符串转换为时间。
- encoding参数指定文件的编码。
- usecols参数指定需要读入的列。
import pandas as pddf_list = []for df in pd.read_csv( "c:\\WHO_first9cols.csv", encoding="utf-8", #编码格式 usecols=[0, 1, 4], #选择那几列 parse_dates=[2], #转为时间格式,文件中为第4列,选中的第2列 chunksize=100,): #每次读100行 df_list.append(df)print df_list
- HDF5文件,HDF5文件像一个保存数据的文件系统,其中只有两种类型的对象:资料数据和目录。
import pandas as pdimport numpy as npstore = pd.HDFStore("C:\\a.hdf5", complib="blosc", complevel=9)df1 = pd.DataFrame(np.random.rand(100000, 4), columns=list("ABCD"))df2 = pd.DataFrame(np.random.randint(0, 1000, (1000, 3)), columns=["one", "two", "there"])s1 = pd.Series(np.random.rand(1000))store["dataframes/df1"] = df1store["dataframes/df2"] = df2store["series/s1"] = s1print store.keys()#_f_walknodes()可以遍历其包含的所有节点,root = store.get_node("//")for node in root._f_walknodes(): print node#append可以实现添加数据的功能。#append参数为False表示覆盖已存在的数据,如果指定键不存在可以忽略该参数。store.append('dataframes/df_dynamic1', df1, append=False)df3 = pd.DataFrame(np.random.rand(100, 4), columns=list("ABCD"))store.append('dataframes/df_dynamic1', df3) #将df3追加到指定键print store['dataframes/df_dynamic1'].shape#使用append()强创建pytables中文支持索引的表格节点,默认使用DataFrame的index做为索引。#通过select()可以对表格进行查询,以获取满足查询条件的行。print store.select("dataframes/df_dynamic1", where='index > 97 & index < 102')#如果希望dataframe的指定的列索引,可以在用append()创建新的表格时,通过data_columns制定索引列,或将其设置为True以对所有列创建索引。store.append('dataframes/df_dynamic1', df1, append=False, data_columns=["A", "B"])print store.select('dataframes/df_dynamic1', where='A > 0.99 & B <0.01')
8.数值计算函数
Series和DataFrame对象都支持Numpy的数组接口,因此可直接用Numpy提供的ufunc函数对他们进行计算。这些函数都有如下三个常数:
- axis:指定运算对应的轴
- level:指定运算对应的索引级别
- skipna:运算是否自动跳过NaN
Pandas还提供了rolling_*()函数来对序列中相邻的N个元素进行移动窗口运算。下面是对带脉冲噪声的正弦波进行处理的结果。他们的第二个参数为窗口包含的元素个数,而center参数为True表示移动窗口以当前元素为中心。
import numpy as npimport pandas as pdt = np.linspace(0, 10, 400)x = np.sin(0.5*2*np.pi*t)x[np.random.randint(0, len(t), 40)] += np.random.normal(0, 0.5, 40)s = pd.Series(x, index=t)s_mean = s.rolling(5, center=True).mean() #实现移动平均s_median = s.rolling(5, center=True).median() #实现中值滤波from matplotlib import pyplot as pltplt.plot(t, x, label=u"噪声信号")plt.plot(t, s_mean, label=u"移动平均")plt.plot(t, s_median, label=u"中值滤波")plt.legend()plt.savefig("C:\\figure1.png")
9.字符串处理
import pandas as pds = pd.Series(['a', 'b', 'c'])print s.str.upper()s_utf8 = pd.Series([b"北京", b"北京市", b"北京地区"])s_unicode = s_utf8.str.decode("utf-8")s_gb2312 = s_unicode.str.encode("gb2312")print s_utf8.str.len() #UTF-8一个汉字占3个字节print s_unicode.str.len() #实际的汉子格式print s_gb2312.str.len() #一个汉字占两个字节#无论Series对象包含那种字符串对象,其dtype属性都是object,因袭无法根据他判断字符串类型。s = pd.Series(["a|bc|de", "x|xyz|yz"])s_list = s.str.split("|")s_comma = s_list.str.join(",")print s_listprint s_comma
处理特定分隔符分割关键字的数据:
import ioimport pandas as pdimport numpy as nptext = """A, B|C|DB, E|FC, AD, B|C"""df = pd.read_csv(io.BytesIO(text), skipinitialspace=True, header=None)print dfnodes = df[1].str.split("|")print nodes.str.len()'''0 31 22 13 2'''from_node = df[0].values.repeat(nodes.str.len().astype(np.int32))#调用numpy的repeat()方法将第一列的数据重复相应的次数,repeat只接受32位的数据to_nodes = np.concatenate(nodes)#将嵌套列表平坦化,转为一维数组。astype()转换数据类型print pd.DataFrame({"from_node":from_node, "to_node":to_nodes})'''还可以吧第二列看做第一列数据的标签,为了后续分析,通常用str.get_dummies()将这种数据转换为布尔DataFrame对象,每一列与一个标签对应,元值为1表示对应的行包含对应的标签'''print df[1].str.get_dummies(sep="|") 0 10 A B|C|D1 B E|F2 C A3 D B|C0 31 22 13 2Name: 1, dtype: int64 from_node to_node0 A B1 A C2 A D3 B E4 B F5 C A6 D B7 D C A B C D E F0 0 1 1 1 0 01 0 0 0 0 1 12 1 0 0 0 0 03 0 1 1 0 0 0
10.时间序列:
import pandas as pd#Period是一个标准的时间段now_day = pd.Period.now(freq='D')now_hour = pd.Period.now(freq="H")#具体到小时,无分钟print now_dayprint now_hourperid = pd.Period.now(freq="W") #以周天未开始的星期时间段print perid.start_time, perid.end_time #获取时间段的开始时间和结束时间#调用Timestamp对象的to_period()方法可以把时间点转换为包含该时间点的时间段。now = pd.Timestamp.now()print now.to_period("H")#将两个时间点相减可以得到表示时间间隔的Timedelta对象。national_day = pd.Timestamp("2017-10-1")td = national_day - pd.Timestamp.now()print td#时间点和时间间隔之间可以进行加减计算:print national_day + pd.Timedelta("268 days 13:27:07")#也可以通过关键字参数直接指定时间间隔的天数、小时数、分钟数print pd.Timedelta(days=10, hours=1, minutes=2, seconds=10.5)print pd.Timedelta(seconds=100000)
0 0
- pandas入门
- pandas入门
- Pandas入门
- Pandas入门
- pandas入门
- pandas入门
- Pandas 入门
- pandas入门
- Pandas入门
- pandas 数据分析入门
- pandas入门(持续更新)
- 10分钟入门pandas
- pandas入门-数据结构(1)
- pandas入门-数据结构(2)
- Python pandas 入门
- Pandas入门(上)
- Pandas入门(中)
- Pandas入门(下)
- Hive数据库及表的基本操作
- HDU 1007 Quoit Design
- Android 开发实战经验总结
- 分数化小数
- oracle导入导出命令
- Pandas入门
- 递推平均滤波
- 程序实训报告--歌手大奖赛计分程序
- Sublime 使用技巧
- lucene(4)——版本5.X写排序
- Tensorflow系列:reshape
- 类模板的偏特化
- error C2440 “=” 无法从“XXXXX ”转换为“XXXXX ”
- Android面试 - 音频焦点(Audio Focus)