相关系数和协方差唯一值值计数及成员资格处理缺失数据层次化索引数据透视生成重排分级次序根据级别汇总统计列索引转为行索引读取文件导出文件数据库风格的DataFrame合并pandas知识体系图
Pandas是一个开源的Python数据分析库。pandas具有强大的数据分析功能,这不仅体现在其数据分析功能的完备性,更体现在其对于大数据运算的速度,它可以将几百MB数据以高效的向量化格式加载到内存,在短时间内完成1亿次浮点计算。纽约大学柯朗研究所博士后Chris Stucchio在文章《别老扯什么Hadoop了,你的数据根本不够大》中指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择。可见,在数据量为几百MB的情况下,用pandas进行处理无疑是一个明智的选择。
值得一提的是,pandas能够轻松完成SQL、MySQL等数据库中的对数据库的查找或表连接等功能,对于大量数据,只需耐心花些时间完成上传数据工作,其后的数据处理速度完全不亚于数据库的处理速度,而且能够实现更高的灵活性。
Pandas把结构化数据分为了三类: 1. Series 1维序列,可视作为没有column名的、只有一个column的DataFrame; 2. DataFrame 同Spark SQL中的DataFrame一样,其概念来自于R语言,为多column并schema化的2维结构化数据,可视作为Series的容器(container); 3. Panel 为3维的结构化数据,可视作为DataFrame的容器。
下面我们将通过Python中的pandas包完成常见的数据分析任务:
相关系数和协方差
import pandas.io.data
as web
from pandas
import DataFrame,Series
import pandas
as pd
import numpy
as np
all_data = {}
for tricker
in [
'AAPL',
'IBM',
'MSFT',
'GOOG']:
all_data[tricker] = web.get_data_yahoo(tricker,
'1/1/2000',
'1/1/2010')
price = DataFrame({tic:data[
'Adj Close']
for tic,data
in all_data.iteritems()})
volume = DataFrame({tic:data[
'Volume']
for tic,data
in all_data.iteritems()})
returns = price.pct_change()
print returns.tail()
returns.MSFT.corr(returns.IBM)
returns.MSFT.cov(returns.IBM)
returns.corr()
returns.cov()
returns.corrwith(returns.IBM)
returns.corrwith(volume)
唯一值、值计数及成员资格
obj = Series([
'c',
'a',
'd',
'a',
'a',
'b',
'c',
'v',
'g'])
uniques = obj.unique()
uniques
obj.value_counts()
pd.value_counts(obj.values,sort=
False)
mask = obj.isin([
'b',
'c'])
mask
obj[mask]
处理缺失数据
string_data = Series([
'a',
'c',
'a',
'd',
'a',
'a',
'b',
'c',np.nan,
'a',
'b',
'c',
'v',
'g'])
string_data.isnull()
string_data[
0] =
None
string_data.isnull()
string_data.dropna()
string_data[string_data.notnull()]
data = DataFrame([[np.nan,
2,
3],[np.nan,
4,
5],[
4,
5,
6],[np.nan,np.nan,np.nan]])
data
data.dropna()
data.dropna(how=
'all')
df = DataFrame(np.random.randn(
7,
3))
df.ix[:
4,
1] = np.nan
df.ix[:
2,
2] = np.nan
df
df.dropna(thresh=
2)
'''填充缺失数据'''
df.fillna(
0)
df.fillna({
1:
0.5,
3:-
1,
2:
0.1})
_ = df.fillna({
1:
0.5},inplace=
True)
df
df.fillna(method=
'ffill')
df.fillna(method=
'ffill',limit=
2)
data.fillna(data.mean())
层次化索引
data1 = 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]])
data1
data1.index
data1[
'b']
data1[
'b':
'd']
data1.ix[[
'b',
'd']]
data1[:,
2]
数据透视生成
data1.unstack()
data1.unstack().stack()
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
frame.index.names = [
'key1',
'key2']
frame.columns.names = [
'state',
'color']
frame
frame[
'ohio']
重排分级次序
frame.swaplevel(
'key1',
'key2')
frame.sortlevel(
1)
frame.swaplevel(
0,
1).sortlevel(
0)
根据级别汇总统计
frame.sum(level=
'key2')
frame.sum(level=
'color',axis=
1)
'''使用DataFrame的列'''
frame1 = DataFrame({
'a':range(
7),
'b':range(
7,
0,-
1),
'c':[
'one',
'one',
'one',
'two',
'two',
'two',
'two'],
'd':[
0,
1,
2,
0,
1,
2,
3]})
列索引转为行索引
frame2 = frame1.set_index([
'c',
'd'])
frame2
frame2 = frame1.set_index([
'c',
'd'],drop=
False)
frame2
frame2.reset_index()
import numpy
as np
import pandas
as pd
from pandas
import DataFrame,Series
读取文件
pd.read_csv(
'',nrows=
1)
pd.table(
'',sep=
' ')
pd.read_csv(
'',header=
None)
pd.read_csv(
'',names=[
'a',
'b',
'c'])
pd.read_csv(
'',names=names,index_col=
'a')
导出文件
data.to_csv(
'',na_rep=
'NULL')
数据库风格的DataFrame合并
df1 = DataFrame({
'key':[
'b',
'b',
'a',
'c',
'a',
'a',
'b'],
'data1':range(
7)})
df2 = DataFrame({
'key':[
'a',
'b',
'd'],
'data1':range(
3)})
pd.merge(df1,df2,on=
'key')
pd.merge(df1,df2,left_on=
'key1',right_on=
'key2')
df1
df2
pd.merge(df1,df2,on=
'key',how=
'outer')
pd.merge(df1,df2,on=
'key',how=
'left')
pd.merge(df1,df2,on=
'key',how=
'inner')
left = DataFrame({
'key1':[
'foo',
'foo',
'bar'],
'key2':[
'one',
'two',
'one'],
'lval':[
1,
2,
3]})
right = DataFrame({
'key1':[
'foo',
'foo',
'bar',
'bar'],
'key2':[
'one',
'one',
'one',
'two'],
'lval':[
4,
5,
6,
7]})
left
right
pd.merge(left,right,on=[
'key1',
'key2'],how=
'outer')
pd.merge(left,right,on=
'key1')
pd.merge(left,right,on=
'key1')
pd.merge(left,right,on=
'key1',suffixes=(
'_left',
'_right'))
left1 = DataFrame({
'key':[
'a',
'b',
's',
'a',
'b',
'a',
'b'],
'value1':[
1,
2,
3,
1,
2,
3,
1]})
right1 = DataFrame({
'vallue2':[
4,
5]},index=[
'a',
'b'])
pd.merge(left1,right1,left_on=
'key',right_index=
True)
pd.merge(left1,right1,left_on=
'key',right_index=
True,how=
'outer')
lefth = DataFrame({
'key1':[
'ohio',
'ohio',
'ohio',
'nevada',
'nevada'],
'key2':[
2000,
2001,
2002,
2001,
2002],
'data':np.arange(
5.)})
righth = DataFrame(np.arange(
12).reshape((
6,
2)),
index=[[
'nevada',
'nevada',
'ohio',
'ohio',
'ohio',
'ohio'],
[
2001,
2000,
2000,
2000,
2001,
2002]],
columns=[
'event1',
'event2'])
lefth
righth
pd.merge(lefth,righth,left_on=[
'key1',
'key2'],right_index=
True)
pd.merge(lefth,righth,left_on=[
'key1',
'key2'],right_index=
True,how=
'outer')
left2 = DataFrame({
'ohio':[
1,
4,
2,
6,
4,
7,
8],
'nevada':[
2,
4,
5,
2,
6,
6,
4]},
index=[
'a',
's',
'c',
'a',
'b',
'c',
'c'])
right2 = DataFrame({
'Missouri':[
10,
11,
35],
'alabama':[
45,
34,
56]},
index=[
'c',
'a',
'e'])
pd.merge(left2,right2,left_index=
True,right_index=
True)
pd.merge(left2,right2,left_index=
True,right_index=
True,how=
'outer')
left2.join(right2,how=
'outer')
left1.join(right1,on=
'key')
left2.join([right2,another])
pandas知识体系图
注:本文来源于《用Python进行数据分析》学习笔记,如有错漏,恳请指正~