pandas,数据处理技巧

其主要数据类型是,pandas.core.frame.DataFrame
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html#官网网址

发现调用pandas的read_csv()方法时,默认使用C engine作为parser engine,而当文件名中含有中文的时候,用C engine在部分情况下就会出错(在两台电脑上试了一下一台出错一台没问题,具体原因待分析)。
尝试了一下在调用read_csv()方法时指定engine为Python,问题解决。

定义DataFrame的方法,还可以用“字典套字典”的方式:

newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}}

DataFrame 对象的每竖列都是一个 Series 对象,那么可以先定义一个 Series 对象,然后把它放到 DataFrame 对象中

 sdebt = Series([2.2, 3.3], index=["a","c"])  

['列索引'][‘行索引’]

pd.head()#前几个数据
pd.describe()#描述性统计

reset_index()

pd['col'].apply(lambda x: x)#pd某列的所有元素进行同一函数调用
pd.index#行索引
pd.columns#列索引
pd.dtypes#属性类型
pd.keys() 或者 pd.columns #键
pd.columns = ["Count", "Column Type"]#可直接修改每一列的列名称
pd.ix[0] 或 pd.iloc[0]#第0行
pd.drop(["id", "timestamp", "price_doc"], axis=1)#删掉这几个属性
missing_df = train_df.isnull().sum(axis=0).reset_index()#is_null()是判断pd数据里的每一个数值是否是null,
pd.groupby('col').mean()#pd以某一列做聚合.
train_df['price_doc'].groupby(train_df['yearmonth']).mean()或者train_df.groupby('yearmonth').aggregate('price_doc').median().reset_index()

价格以年月分为基准做一平均,返回的是series

train_df['price_doc'].groupby(train_df['yearmonth']).mean().reset_index()返回的是一df
train_df.groupby(train_df['yearmonth']).mean()#所有属性以年月分为基准做一平均

object类型变量处理

lbl = preprocessing.LabelEncoder()
lbl.fit(list(train_df[obj].values))
lbl.transform(list(train_df[obj].values))

f=open(fileName)
data=pd.read_csv(f)

“ ”.join(list)#将一list转换成str

sorted()可以对list,array某列进行排序
sorted(food,key=lambda x: x[0])#food是一个list,每个元素是一tuple,tuple有两个元素,这里按第一列进行排序,list排序还是很方便的
train_df['seperated_ingredients'].str.replace(',',' ')#字符替换
train_df[train_df['cuisine']==cuisine]

CountVectorizer#"""Convert a collection of text documents to a matrix of token counts
class TfidfVectorizer(CountVectorizer):
"""Convert a collection of raw documents to a matrix of TF-IDF features.
Equivalent to CountVectorizer followed by TfidfTransformer.

encoder = LabelEncoder()
y_transformed = encoder.fit_transform(train_df.cuisine)#把字符标签转换成数字标签

对于series
可以通过下标,或索引来获取值
sdebt = Series([2.2, 3.3], index=["a","c"]) ,sdebt[0]等价于sdebt['a']
可以吧Series看作有序的字典,所以很多字典的方法都可以用,而且numPy方法也可以
Series最重要的一个功能:它在算法运算中会自动对齐不同索引的数据。
Series对象本身及其索引都有一个name属性

index方法

DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型。DataFrame既有行索引也有列索引,其每行每列都是一Series
定义一个 DataFrame 对象的常用方法——使用 dict 定义。字典的“键”("name","marks","price")就是 DataFrame 的 columns 的值(名称),字典中每个“键”的“值”是一个列表,它们就是那一竖列中的具体填充数据
创建DataFrame

data = {"name":["yahoo","google","facebook"], "marks":[200,400,800], "price":[9, 3, 7]} 
f1 = DataFrame(data) 
f2 = DataFrame(data,column=['name','price','marks'])#按照列name,price,marks先后次序排序
f3 = DataFrame(data, columns=['name', 'price', 'marks', 'debt'], index=['a','b','c']) 

DataFrame,获取行数据 f3.ix['a'],获取列数据f3['name']
del f3['name']#删除列name

obj=Series([4,5,6,7],index=['d','b','a','c'])
obj2=obj.reindex(['a','b','c','d','e'],fill_value=0)#创建一个适应新索引的新对象,如果某个索引值当前不存在,就引入缺失值。此处fill_value是对缺失值处理,这里设为0

obj3=Series(['blue','purple','yellow'],index=[0,2,4])
obj3.reindex(range(6),method='ffill')#前向插值处理缺失值

对于pandas,横轴为0 ,纵轴为1
最好统一使用ix来获取行列数据,甚至可以通过ix[i,j]获得某个元素
frame.ix[0]#第一行,frame.ix[:,0]#第一列
对于dataFrame,还可以用于columns
如:frame=DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['Ohio','Texas','California'])
frame2=frame.reindex(['a','b','c','d'])#对行
frame.reindex(columns=['Texas','Ohix','California'])
frame.reindex(index=['a','b','c','d'],method='ffill',columns=['Texas','Ohix','California'])#同时对行和列进行重新索引,而插值则只能按行应用(轴0)

对于DataFrame,可以删除任意轴上的索引值。

获取元素ix操作

将函数应用到各列或行所形成的一维数组上。
f=lambda x:x.max()-x.min()
frame = DataFrame(np.random.randn(4,3),column=list('bde'),index=['Utah','Ohio','Texas','Oregon'])

frame.apply(f,axis=1)

def f(x):
return Series([x.min(),x.max()],index=['min','max'])
frame.apply(f,axis)

applymap,运用到所有元素
Serires有一个用于应用元素级函数的map方法:
sort_index(),可以对于任意轴(行,列)按索引大小进行排序
frame = DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
frame.sort_index(by='b')#以b排序标准,对其他列也排序
若要按值对Series进行排序,可使用order方法

rank方法
obj = Series([7,-5,7,4,2,0,4])
obj.rank()
obj.rank(method='first')
obj.rank(ascending=False,method='max')
排名时用于破坏平级关系的method选项
'average' 默认:在相等分组中,为各个值分配平均排名
'min' 使用整个分组的最小排名
'max' 使用整个分组的最大排名
'first' 按值在原始数据中的出现顺序分配排名

pandas是支持带有重复索引值

汇总和计算描述统计

NAN会自动排除,通过设置参数skipna=False可解除
df.sum(axis = 1,skipna=False)

obj.value_counts()是用于计算一个Series中各值出现的频率
obj.inin(['b','c'])判断矢量化集合的成员资格。

处理缺失数据

Python内置的None值也会被当做NaN处理

NA处理方法
dropna 根据各标签的值是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容仍度
fillna 用指定值或插值方法(ffill或bfill)
isnnull

层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个索引级别。
data = Series(np.random.randn(10),index=[['a','a','a','b','b', 'b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]])
data['b']
data[:,2]#获取内层索引2的数据
data.unstack()#生成一个DataFrame
data.unstack().stack()#unstack的逆运算
对于DataFrame,每条轴都可以有分层索引。
frame = DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
frame.index.names=['key1','key2']
frame.columns.names=['state','color']

DataFrame的set_index函数会将一个或多个列转换为行索引,并创建一个新的DataFrame,
frame = DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
frame2=frame.set_index(['Colorado'])

pandas有一个Panel数据结构,可以将其看作一个三维的DataFrame,Panel中的每一项(类似于DataFrame的列)都是一个DataFrame

数据加载,存储于文件格式

read_csv,默认分隔符为逗号;
read_table 默认分隔符为制表符(\t)
pd.read_csv("file.csv",nrows=5)#读取前5行
pd.read_csv("file.csv",chunksize=100)#有点类似迭代器

to_csv(),将数据写到一个以逗号分隔的文件中

JSON

JSON(javaScript Object Notation)已经成为通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一
Python本身的标准库json,json.loads可将Json字符串转换成Python形式。json.dumps则将Python对象转换成Json格式

XML和HTML:Web信息收集
lxml能够高效且可靠地解析大文件。lxml.html处理HTML,lxml.objectify处理XML
from lxml.html import parse
from urllib.request import urlopen

数据规整化:清理,转换,合并,重塑

pd.merge(df1,df2)#将df1,df2根据相同的键合并,how决定连接方式,on决定键

轴向连接concat,类似于numpy的concatenate

posted @ 2018-02-25 14:44  blog_hfg  阅读(419)  评论(0)    收藏  举报