Python数据分析-Day2-Pandas模块
1、pandas简介
Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
pandas是numpy库的更高级封装,pandas方法中很多是调用了numpy库的方法
2、pandas基本操作
1)文件读取
import pandas
food_info=pandas.read_csv("food_info.csv")
print(type(food_info))
print(food_info.dtypes)
print(help(pandas.read_csv))
output:
<class 'pandas.core.frame.DataFrame'> # DataFrame就是pandas的核心数据结构,类似矩阵结构;numpy的核心数据结构是ndarray,详情见上一章
--------------
NDB_No int64
Shrt_Desc object #pandas对字符型数据类型定义较为怪异,称之为 object类型,object=str
Water_(g) float64
Energ_Kcal int64
Protein_(g) float64
Lipid_Tot_(g) float64
Ash_(g) float64
Carbohydrt_(g) float64
Fiber_TD_(g) float64
Sugar_Tot_(g) float64
Calcium_(mg) float64
Iron_(mg) float64
Magnesium_(mg) float64
Phosphorus_(mg) float64
Potassium_(mg) float64
Sodium_(mg) float64
Zinc_(mg) float64
Copper_(mg) float64
Manganese_(mg) float64
Selenium_(mcg) float64
Vit_C_(mg) float64
Thiamin_(mg) float64
Riboflavin_(mg) float64
Niacin_(mg) float64
Vit_B6_(mg) float64
Vit_B12_(mcg) float64
Vit_A_IU float64
Vit_A_RAE float64
Vit_E_(mg) float64
Vit_D_mcg float64
Vit_D_IU float64
Vit_K_(mcg) float64
FA_Sat_(g) float64
FA_Mono_(g) float64
FA_Poly_(g) float64
Cholestrl_(mg) float64
dtype: object
--------------
2)显示dataframe数据前几行:
first_rows = food_info.head() #pandas的数据格式下调用head方法,是读取该数据格式的数据包括表头,如果不写参数,默认读取前5行数据。
print first_rows
#print(food_info.head(3))
3)显示dataframe数据尾几行:
last_rows = food_info.tail() #pandas的数据格式下调用tail方法,是读取该数据格式的数据包括表头,如果不写参数,默认读取后5行数据。
print last_rows
4)dataframe列名
print food_info.columns #打印dataframe数据类型下的各列列名。
5)dataframe样本数和指标数
print food_info.shape #打印dataframe形状,几行几列,其中行数就是样本数,列数就是指标数。
6)pandas取数据
按样本(行)取数据:
pandas数据读取相对麻烦,不像python或numpy那样简单。pandas需要调用一个函数,才能对相关数据进行读取。
这个方法就是loc[]方法,如下
print food_info.loc[0]#dataframe数据有一个特征,就是样本数和指标数的分离。无论什么数据在dataframe里指标数固定,这里的索引index=0,是对样本进行索引。
output: #所以这里取出的是样本1所对应的所有属性或指标。
NDB_No 1001
Shrt_Desc BUTTER WITH SALT
Water_(g) 15.87
Energ_Kcal 717
Protein_(g) 0.85
Lipid_Tot_(g) 81.11
Ash_(g) 2.11
Carbohydrt_(g) 0.06
Fiber_TD_(g) 0
Sugar_Tot_(g) 0.06
Calcium_(mg) 24
Iron_(mg) 0.02
Magnesium_(mg) 2
Phosphorus_(mg) 24
Potassium_(mg) 24
Sodium_(mg) 643
Zinc_(mg) 0.09
Copper_(mg) 0
Manganese_(mg) 0
Selenium_(mcg) 1
Vit_C_(mg) 0
Thiamin_(mg) 0.005
Riboflavin_(mg) 0.034
Niacin_(mg) 0.042
Vit_B6_(mg) 0.003
Vit_B12_(mcg) 0.17
Vit_A_IU 2499
Vit_A_RAE 684
Vit_E_(mg) 2.32
Vit_D_mcg 1.5
Vit_D_IU 60
Vit_K_(mcg) 7
FA_Sat_(g) 51.368
FA_Mono_(g) 21.021
FA_Poly_(g) 3.043
Cholestrl_(mg) 215
Name: 0, dtype: object
同样dataframe.loc[3:6]可以对pandas的数据进行切片,方法与python类似。
想取任意数据的话,只需要把其对应的索引值传入就可以了。
按指标(列)取数据:
ndb_col = food_info["NDB_No"] #在dataframe格式下,把列名作为索引传递给数据对象,就可以得到这一列的所有数据。
print ndb_col
如果想打印多列:
columns = ["Zinc_(mg)", "Copper_(mg)"] #先把想打印的列名组合成一个list格式
zinc_copper = food_info[columns] #然后一起传递给dataframe的数据对象,就可以多列打印了。
print zinc_copper
需求:在这些数据中,找出以‘g’为结尾的列名和整列数据
col_names = food_info.columns.tolist() # columns方法是提取列名,tolist方法是把列名转化成list格式
gram_columns = []
for c in col_names: #遍历可迭代对象col_names
if c.endswith("(g)"):
gram_columns.append(c)
gram_df = food_info[gram_columns] #把以“g”结尾的列名为索引代入dataframe对象,得出对应的多列数据。
print(gram_df.head(3))
7)pandas中的数据类型
#object - For string values
#int - For integer values
#float - For float values
#datetime - For time values
#bool - For Boolean values
#print(food_info.dtypes)
3、pandas加减乘除的操作
对整列的数据的操作,等价于对该列中每个元素进行对应的操作,与numpy类似。
print food_info["Iron_(mg)"]
div_1000 = food_info["Iron_(mg)"] / 1000
print div_1000
对两个列进行组合:
water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]
这个两列相乘,是把两列中同一样本的不同数据对应相乘,把结果保存成一个新的列
添加新属性,即添加新列:
iron_grams = food_info["Iron_(mg)"] / 1000
food_info["Iron_(g)"] = iron_grams
添加有个前提,就是添加的数据样本数要和原dataframe样本数一致,即行数一样,直接用索引+赋值的方式添加即可。
求某列的最大值:
max_calories = food_info["Energ_Kcal"].max()
首先定位好要求最大值的列,然后直接调用max方法,即可求出某列的最大值。
4、pandas的排序操作
food_info.sort_values("Sodium_(mg)", inplace=True)
print food_info["Sodium_(mg)"]
对dataframe数据结构调用sort_values方法即可排序,默认是从小到大排序。第一个参数是要对哪一个列进行排序,inplace是判断是新生成dataframe还是覆盖旧的。
food_info.sort_values("Sodium_(mg)", inplace=True, ascending=False)
print food_info["Sodium_(mg)"]
需要降序排列时,要指定sort_values的参数ascending=False,ascending的意思是升序。这个值默认是True,给它改成False就是降序排列了。
5、泰坦尼克号pandas处理实例
1)数据导入
import pandas as pd
import numpy as np #一般我们用np代替numpy,用pd代替pandas
titanic_survival = pd.read_csv("titanic_train.csv") #读入csv文件
titanic_survival.head() #显示头几个数据
2)数据操作
age = titanic_survival["Age"] #选中Age这一列,并把它单独保存
#print(age.loc[0:10]) #age这时候已经只有一列,就是刚刚选出来的,这时候调用loc函数,输入切片位置,就可以仅仅取出age中对应位置的数据了
age_is_null = pd.isnull(age) #isnull方法是判断该数据中数据位是不是为空,如果为空返回True,括号里传入需要判断的数据组
#print age_is_null
age_null_true = age[age_is_null] #把bool值作为索引传入,得到数据为空的那些数据
#print age_null_true
age_null_count = len(age_null_true) #判断数据为空的个数
print(age_null_count)
3)null值的影响
mean_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"]) #先对age这一列求和,然后除以age这一列的个数
print mean_age
output:
Nan
这种情况就是因为sum中有null空值,所以结果就会报错。
4)null值的处理
good_ages = titanic_survival["Age"][age_is_null == False] #age_is_null==False是取出不是缺失值的数据
#print good_ages
correct_mean_age = sum(good_ages) / len(good_ages)
print correct_mean_age
当然求均值可以直接调用mean方法,如下
correct_mean_age = titanic_survival["Age"].mean()
print correct_mean_age #这段代码的输出结果与上一段代码的结果完全一样。
5)数据统计
需求:求出每个不同等级的船舱的平均船票
#mean fare for each class
passenger_classes = [1, 2, 3] #先设置船舱等级列表
fares_by_class = {} #建立一个空字典,准备存放不同船舱的平均船票数据
for this_class in passenger_classes: #遍历不同等级的船舱
pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class] #先取出船舱列,对比目前遍历等级取出对应等级船舱数据
pclass_fares = pclass_rows["Fare"] #在这类数据中,取出价格列
fare_for_class = pclass_fares.mean() #求该价格列的平均值
fares_by_class[this_class] = fare_for_class #以船舱等级为key值,平均fare为value值,存入字典中
print fares_by_class #打印字典
pd自带的统计函数:pivot_table
passenger_survival = titanic_survival.pivot_table(index="Pclass", values="Survived", aggfunc=np.mean)
#index是以谁为基准统计,values是基准和谁之间的关系, aggfunc是要统计前两个参数之间的什么关系。
print passenger_survival
统计不同等级船舱的乘客的平均年龄:
passenger_age = titanic_survival.pivot_table(index="Pclass", values="Age")#以pclass为基准统计,统计的值是age的平均值。aggfunc默认值为np.mean
print(passenger_age)
统计一个变量和其他两个量之间的关系:
port_stats = titanic_survival.pivot_table(index="Embarked", values=["Fare","Survived"], aggfunc=np.sum)
print(port_stats)
#以embarked为基准,统计它和fare与survived的关系,统计的关系为求和。即在不同码头登船的人的总费用和总的获救数量。
6)丢掉null值:dropna
drop_na_columns = titanic_survival.dropna(axis=1) #横向丢掉缺失数据的样本
new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age", "Sex"]) #纵向去掉,age和sex这两列中如果有缺失值,去掉该样本。
#print new_titanic_survival
7)通过索引调取数据
row_index_83_age = titanic_survival.loc[83,"Age"] #通过索引调取数据,都需要使用loc函数,位置1输入样本序号,位置2输入对应的属性
row_index_1000_pclass = titanic_survival.loc[1000,"Pclass"]
print row_index_83_age
print row_index_1000_pclass
8)排序后重新设置索引
new_titanic_survival = titanic_survival.sort_values("Age",ascending=False) #以age为依据降序排列
print new_titanic_survival[0:10] #取新数据的前11个样本,即年龄最大的前11个样本
itanic_reindexed = new_titanic_survival.reset_index(drop=True) #对新的dataframe数据,调用reset_index重新设置索引,drop为true意思是删除原有index。
print(titanic_reindexed.iloc[0:10])
6、pd自定义函数
1)例子1:
def hundredth_row(column): #首先定义一个函数
hundredth_item = column.loc[99] #函数内调用loc方法,使得程序返回第100个样本数据
return hundredth_item #用return把数据返还给调用该函数的位置
hundredth_row = titanic_survival.apply(hundredth_row) #对dataframe数据调用apply方法里面传入之前定义的函数,即执行自定义函数的操作。
print hundredth_row
2)例子2:
def not_null_count(column): #定义一个函数,形参必须为column,名字可以任取,默认column处会以遍历的方式把每一列的列名都代入。
column_null = pd.isnull(column) #调用pd的isnull方法,遍历的判断每列中的所有数据是否是缺失状态
null = column[column_null] #把每列中缺失的样本赋值给null
return len(null) #遍历的方式返回每列中缺失值的数量
column_null_count = titanic_survival.apply(not_null_count) #对dataframe数据执行apply方法,直接调用自定义函数
print column_null_count
3)例子3:
def which_class(row):
pclass = row['Pclass']
if pd.isnull(pclass):
return "Unknown"
elif pclass == 1:
return "First Class"
elif pclass == 2:
return "Second Class"
elif pclass == 3:
return "Third Class"
classes = titanic_survival.apply(which_class, axis=1)
print classes
4)例子4:
def generate_age_label(row): #定义一个函数,形参为row
age = row["Age"] #
if pd.isnull(age):
return "unknown"
elif age < 18:
return "minor"
else:
return "adult"
age_labels = titanic_survival.apply(generate_age_label, axis=1)
print age_labels
7、series结构
dataframe中的单独的一行或一列就叫做series结构。而dataframe就是相当于多个series组成的矩阵。
series结构也是可以通过索引和切片进行定位的。
通过索引拿出series的一个值,这个值的结构是ndarry,所以series由ndarray结构组成,所以pandas实际上是对numpy的更高级封装
如果想生成一个series需要from pandas import Series,并且调用Series函数。对Series而言可以用数字也可以用字符作为它的索引值
series的排序方法sorted方法和reindex方法等
用add函数对两个series相加,如果维度相同,则对应位置相加
dataframe结构也是可以设定str值为索引值的,如果这么设定了后,那么dataframe就有两个索引值了,数值和str值
8、pandas画图
pandas中有一类数据结构就是datetime,调用pd.to_datetime可以把非标准的时间格式转化为标准的时间格式。
首先画图前要导入matplotlib.pyplot库 as plt
plt.plot() #画出图
plt.show() #展示画出的图
plt.plot(x,y) #x是x轴数据,y是y轴数据
plt.plot() #show方法不变
plt.xticks(rotation = 45) #让横轴ticks数据旋转45°
plt.xlabel('') #x轴的名称,y轴一样
plt.title('') #整个图的标题
plt.show() #当对横轴、纵轴还有标题设计好后,最后再调用plt.show()方法画图。
Python数据分析-Day2-Pandas模块的更多相关文章
- 【Python 数据分析】pandas模块
上一节,我们已经安装了numpy,基于numpy,我们继续来看下pandas pandas用于做数据分析与数据挖掘 pandas安装 使用命令 pip install pandas 出现上图表示安装成 ...
- Python数据分析之pandas学习
Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利 ...
- Python数据分析之pandas
Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利 ...
- Python数据分析库pandas基本操作
Python数据分析库pandas基本操作2017年02月20日 17:09:06 birdlove1987 阅读数:22631 标签: python 数据分析 pandas 更多 个人分类: Pyt ...
- Python数据分析之pandas基本数据结构:Series、DataFrame
1引言 本文总结Pandas中两种常用的数据类型: (1)Series是一种一维的带标签数组对象. (2)DataFrame,二维,Series容器 2 Series数组 2.1 Series数组构成 ...
- Python 数据分析:Pandas 缺省值的判断
Python 数据分析:Pandas 缺省值的判断 背景 我们从数据库中取出数据存入 Pandas None 转换成 NaN 或 NaT.但是,我们将 Pandas 数据写入数据库时又需要转换成 No ...
- Python数据分析之Pandas操作大全
从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...
- python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
1 引言 Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用.本文主要介绍Pandas的几种数据选取的方法. Pandas中,数据主要保存为Dataframe和Se ...
- Python数据分析之pandas入门
一.pandas库简介 pandas是一个专门用于数据分析的开源Python库,目前很多使用Python分析数据的专业人员都将pandas作为基础工具来使用.pandas是以Numpy作为基础来设计开 ...
- 教程 | 一文入门Python数据分析库Pandas
首先要给那些不熟悉 Pandas 的人简单介绍一下,Pandas 是 Python 生态系统中最流行的数据分析库.它能够完成许多任务,包括: 读/写不同格式的数据 选择数据的子集 跨行/列计算 寻找并 ...
随机推荐
- 【题解】Luogu CF86D Powerful array
原题传送门 裸的莫队啊,我博客里有对莫队较详细的介绍 这道题很简单,可以说是裸的模板 但是如何在已有的值上进行操作? 小学生应该都知道 那么转移就超级简单了qaq inline void add(re ...
- python简说(二十五)面向对象
面向对象编程: 类 一个种类.一个模型 实例.实例化.对象 实例.对象: 根据模型制作出来的东西. 实例化: 就是做东西的这个过程. class My: my=My() 私有 方法 类里面的函数 属性 ...
- css 元素居中
css 4种常见实现元素居中的办法: 1.通过 margin 属性调整 : { position: absolute; top: 50%; left: 50%; margin-left: 盒子的一半: ...
- Microsoft Visual Studio 2010(vs10)安装与使用
安装1.下载软件: 云盘分享http://pan.baidu.com/s/1i4JL9GT 2.安装 打开Microsoft Visual Studio 2010目录,双击setup.exe ,运行 ...
- Java基础语法(上)
Java编译报错出现非法字符,原因是存在中文字符. Java关键字的字母都是小写. Java是一种强类型语言,针对每一种数据都给出了明确的数据类型. 数据类型分类: A:基本数据类型 B:引用数据类型 ...
- 从输入URL到页面显示发生了什么
阅读目录 1.输入地址 2.浏览器查找域名的 IP 地址 3.浏览器向 web 服务器发送一个 HTTP 请求 4.服务器的永久重定向响应 5.浏览器跟踪重定向地址 6.服务器处理请求 7.服务器返回 ...
- ECharts公共组件:title详解、 tooltip详解、toolbox详解、legend详解、dataZoom详解、visualMap全解
1. Title mytextStyle={ color:"#333", //文字颜色 fontStyle:"norm ...
- 真心觉得没有必要使用dock和kde桌面
在安装了, 并使用cairo-dock后, 如果不使用 cairo-dock(fallback mode) 或不启用硬件加速, 将导致 cpu的使用率一直是100%, 而且风扇响的太厉害. 说明doc ...
- IDEA引入Gradle工程小记
1.首先IDEA要在该工程Settings中配置本地安装的Gradle,配好其home目录,注意目录到根目录即可,不要到bin一级,否则提示错误,无法使用: 2.配置好后会自动侦测Gradle项目,点 ...
- 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)
题面 题目描述 给出一个有理数 c=\frac{a}{b} ,求 c mod19260817 的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...