python数据分析基础1_Pandas

1.pandas的数据结构
1).Series(序列):一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
2).Time- Series:以时间为索引的Series。
3).DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
4).Panel:三维的数组,可以理解为DataFrame的容器。

in

#首先引入Pandas及Numpy
import numpy as np
import pandas as pd

out
官方推荐的缩写形式为pd,也可以选择其他任意的名称。DataFrame是二维的数据结构,其本质是Series的容器,因此,DataFrame可以包含一个索引以及与这些索引联合在一起的Series,由于一个Series中的数据类型是相同的,而不同Series的数据结构可以不同。因此对于DataFrame来说,每一列的数据结构都是相同的,而不同的列之间则可以是不同的数据结构。或者以数据库进行类比,DataFrame中的每一行是一个记录,名称为Index的一个元素,而每一列则为一个字段,是这个记录的一个属性。创建DataFrame有多种方式:
///
1.1创建Series
in

obj = pd.Series([4,7,-5,3])
obj

out

0    4
1    7
2   -5
3    3
dtype: int64

///
1.2创建DataFrame
1.2.1以字典的字典或Series的字典的结构构建DataFrame,这时候的最外字典对应的是DataFrame的列,内嵌的字典及Series则是其中每个值。
in

d = {'one' :pd.Series([1.,2.,3.],index=['a','b','c']),'two':pd.Series([1.,2.,3.,4.],index=['a','b','c','d'])}
df = pd.DataFrame(d)
df

out
这里写图片描述

可以看到d是一个字典,其中one的值为Series有3个值,而two为Series有4个值。由d构建的为一个4行2列的DataFrame。 其中one只有3个值,因此d行one列为NAN(Not a Number) –Pandas默认的缺失值标记。

1.2.2从字典的列表构建DataFrame,其中每个字典代表的是每条记录(DataFrame中的一行),字典中每个值对应的是这条记录的相关属性。

in

d = [{'one' :1,'two' :1},{'one' :2,'two' :2},{'one' :3,'two' :3},{'two' :4}]
df = pd.DataFrame(d,index=['a','b','c','d'],columns=['one','two'])
df.index.name='index'
df

out
这里写图片描述

以上的语句与以Series的字典形式创建的DataFrame相同,只是思路略有不同,一个是以列为单位构建,将所有记录的不同属性转化为多个Series,行标签冗余,另一个是以行为单位构建,将每条记录转化为一个字典,列标签冗余。使用这种方式,如果不通过columns指定列的顺序,那么列的顺序会是随机的。

个人经验是对于一些已经结构化的数据转化为DataFrame似乎前者更方便,而对于一些需要自己结构化的数据(比如解析log文件,特别是针对较大数据量时),似乎后者更方便。创建了DataFrame后可以通关index name属性为DataFrame的索引指定名称。

1.2.3DataFrame转换为其他类型
in

df.to_dict()

out

{'one': {'a': 1.0, 'b': 2.0, 'c': 3.0, 'd': nan},
 'two': {'a': 1, 'b': 2, 'c': 3, 'd': 4}}

outtype的参数为’dict’、’list’、’Series’、’records’。dict返回的是dict of dict;list返回的是列表的字典;series返回的是序列的字典;records返回的是字典的列表

2.数据文件读取
///
2.1从excel中读写数据
in

#从excel中读入DataFrame
bonus = pd.read_excel(r"E:\temp\newdir\student2.xlsx")
#bonus.head()

#将DataFrame写入excel
bonus.to_excel(r'E:\temp\newdir\student.xlsx',sheet_name='sheet3')
bonus.head()

out
这里写图片描述

///
2.2从CSV中读写数据
in

#从CSV中读入DataFrame
macrodata = pd.read_csv('macrodata.csv')
macrodata.head(1)

#将DataFrame写入CSV
macrodata.to_csv('d:/foo.csv')

3.数据切片、筛选
///
3.1数据切片
3.1.1通过下标选取数据
out

in

d = {'one' : pd.Series([1.,2.,3.],index=['a','b','c']),
     'two' : pd.Series([2.,3.,4.,5.],index=['a','b','c','d'])}
df['one']
#df.pop

out

index
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64

返回df的前三行,返回的为一个Series
in

df[0:3]

out
这里写图片描述

有一点需要注意的是使用起始索引名称和结束索引名称时,也会包含结束索引的数据。使用标签选取数据:
in

#df.loc[行标签,列标签]
#df.loc['a':'b'] #选取ab两行数据
df.loc[:,'one'] #选取one列数据

out

index
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64

df.loc的第一个参数是行标签,第一个参数是列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是DataFrame,否则,则为Series。 使用位置选取数据:

in

#df.iloc[行位置,列位置]
#df.iloc[1,1]  #选取第二行,第二列的值,返回的为单个值
df.iloc[[0,2],:]  #选取第一行及第三行的数据
#df.iloc[0:2],:]  #选取第一行到第三行(不包含)的数据
#df.iloc[:,1]  #选取所有记录的第一列的值,返回的为一个Series
#df.iloc[1,:]  #选取第一行数据,返回的为一个Series

out
这里写图片描述

PS:loc为location的缩写,iloc则为integer & location的缩写
更广义的切片方式是使用.ix,它自动根据你给到的索引类型判断是使用位置还是标签进行切片
in

#df.ix[1,1]
df.ix['a':'b','one':'two']

out

这里写图片描述

///
3.2数据筛选
通过逻辑指针进行数据切片:
in

#df[逻辑条件]
df[df.one >= 2]  #单个逻辑条件
#df[(df.one >=1) & (df.one < 3)]  #多个逻辑条件组合

#bonus[bonus.Bonus_Percent<0.02]

out
这里写图片描述

这种方式获得的数据切片都是DataFrame。
in

bonus[bonus.Bonus_Percent<0.02]

out
这里写图片描述

4.基本运算
///
4.1计算新列
in

macrodata.head(3)
macrodata['qtr'] = macrodata['year'] * 10 + macrodata['quarter']
macrodata.head(3)

///
4.2pandas支持基本的运算及向量化运算
out

in

df
#df.mean()  #计算列的平均值,参数为轴,可选值为0或1,默认为0,即按照列运算
#df.sum()  #计算行的和
df.apply(lambda x: x.max() - x.min())  #将一个函数应用到DataFrame的每一列,这里使用的是匿名lambda函数,与R中apply函数类似

out

one    2.0
two    3.0
dtype: float64

///
4.3设置索引
in

df.set_index('one')

out
这里写图片描述

///
4.4重命名列
in

df.rename(columns={u'one':'1'},inplace=True)
df

out
这里写图片描述

///
4.5查看最大值/最小值
in

print(df['two'].max())  #min取最小
print(df['two'].idxmax())  #idxmin取最小

out

4
d

///
4.6重设索引
in

df.reset_index(inplace=True)
df

out
这里写图片描述

///
4.7改变数据类型
in

df1 = df[['two',]].astype('int')
df.dtypes
df1.dtypes

out

two    int32
dtype: object

///
4.8计算Series每个值的频率
in

df
df['index'].value_counts()

out

b    1
c    1
a    1
d    1
Name: index, dtype: int64

///
4.9字符方法
pandas提供许多向量化的字符操作,可以在str属性中找到它们
in

df
df['index'].str.upper()
#s.str.lower()
#s.str.len()
#s.str.contains(pattern)

out

0    A
1    B
2    C
3    D
Name: index, dtype: object

5.描述性统计
Describe方法可以计算各个列的基本描述统计值。包含计数,平均数,标准差,最大值,最小值及4分位差
in

df.describe().T

out
这里写图片描述

6.排序
DataFrame提供了多种排序方式
df.sort_index(axis=1,ascending=False)
sort_index可以以轴的标签进行排序,axis是指用于排序的轴,可选的值有0和1,默认为0即行标签(Y轴),1为按照列标签排序。ascending是排序方式,默认为True即降序排序。
in

df
#df_obj.sort_values(by=['',''])#同上
df.sort_values(by=u'parent')
#df.sort(columns=['1','two'],ascending=[0,1])
df.sort_values(by=['child','parent'],ascending=[0,1])

out
这里写图片描述

DataFrame也提供按照指定列进行排序,可以仅指定一个列作为排序标准(以单独列名作为columns的参数),也可以进行多重排序(columns的参数为一个列名的List,列名的出现顺序决定排序中的优先级),在多重排序中ascending参数也为一个List,分别与columns中的List元素对应。

7.绘图:散点图和直方图
in

import pandas as pd
import numpy as np

def func(ser,factor):
    z = float(ser.max())-float(ser.min())
    a = float(factor)*z/50
    return ser.apply(lambda x:x+np.random.uniform(-a,a))

df = pd.read_excel(r"E:\temp\newdir\test.xlsx",'Sheet1',index_col=0)
df['child'] = func(df['child'],1)
df['parent'] = func(df['parent'],1)

plt = df.plot(kind='scatter',x='child',y='parent').get_figure()
plt.savefig('2.png')

out
这里写图片描述
in

import numpy as np
import pandas as pd

from statsmodels.formula.api import ols
import matplotlib.pyplot as plt

path = r"E:\temp\newdir\test.xlsx"
df = pd.read_excel(path,'Sheet1',index_col=0)
l = ols('child~parent',df).fit()

plt.plot(df['parent'], df['child'], 'ob')
plt.plot(df['parent'], l.fittedvalues,'r',linewidth=2)
plt.show()

out
这里写图片描述


截图

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值