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模块的更多相关文章

  1. 【Python 数据分析】pandas模块

    上一节,我们已经安装了numpy,基于numpy,我们继续来看下pandas pandas用于做数据分析与数据挖掘 pandas安装 使用命令 pip install pandas 出现上图表示安装成 ...

  2. Python数据分析之pandas学习

    Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利 ...

  3. Python数据分析之pandas

    Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利 ...

  4. Python数据分析库pandas基本操作

    Python数据分析库pandas基本操作2017年02月20日 17:09:06 birdlove1987 阅读数:22631 标签: python 数据分析 pandas 更多 个人分类: Pyt ...

  5. Python数据分析之pandas基本数据结构:Series、DataFrame

    1引言 本文总结Pandas中两种常用的数据类型: (1)Series是一种一维的带标签数组对象. (2)DataFrame,二维,Series容器 2 Series数组 2.1 Series数组构成 ...

  6. Python 数据分析:Pandas 缺省值的判断

    Python 数据分析:Pandas 缺省值的判断 背景 我们从数据库中取出数据存入 Pandas None 转换成 NaN 或 NaT.但是,我们将 Pandas 数据写入数据库时又需要转换成 No ...

  7. Python数据分析之Pandas操作大全

    从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...

  8. python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]

    1 引言 Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用.本文主要介绍Pandas的几种数据选取的方法. Pandas中,数据主要保存为Dataframe和Se ...

  9. Python数据分析之pandas入门

    一.pandas库简介 pandas是一个专门用于数据分析的开源Python库,目前很多使用Python分析数据的专业人员都将pandas作为基础工具来使用.pandas是以Numpy作为基础来设计开 ...

  10. 教程 | 一文入门Python数据分析库Pandas

    首先要给那些不熟悉 Pandas 的人简单介绍一下,Pandas 是 Python 生态系统中最流行的数据分析库.它能够完成许多任务,包括: 读/写不同格式的数据 选择数据的子集 跨行/列计算 寻找并 ...

随机推荐

  1. ssh-keygen 不是内部或外部命令

    如何处理呢? 1.找到Git/usr/bin目录下的ssh-keygen.exe(如果找不到,可以在计算机全局搜索) 2.属性-->高级系统设置-->环境变量-->系统变量,找到Pa ...

  2. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

  3. Java中单例设计模式,饿汉式和懒汉式

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...

  4. Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)

    centos7.5 安装mysql数据库报错 问题: [root@db04-54 scripts]# /etc/init.d/mysqld start /etc/init.d/mysqld: line ...

  5. 用Navicat for Mysql导入.sql文件

    1.在左边右键新建一个数据库 2.字符集选gbk(不 题) 3.打开数据库,把它变成绿色. 4.把.sql文件拖到这数据库上.会出现下边的运行SQL文件对话框,按开始,等运行完后就可以关掉了. 5.最 ...

  6. ODAC(V9.5.15) 学习笔记(五)TSmartQuery

    TSmartQuery是相对于TOraQuery更简洁的数据集,其成员如下 名称 类型 说明 Expand Boolean 缺省为False,如果为True,则表示无论SQL中罗列的字段是哪些,数据集 ...

  7. RabbitMQ 入门指南——安装

    RabbitMQ好文 Rabbitmq Java Client Api详解 tohxyblog-博客园-rabbitMQ教程系列 robertohuang-CSDN-rabbitMQ教程系列 Rabb ...

  8. shell编程(三)之条件判断(if语句)

    练习:写一个脚本判断当前系统上是否有用户的默认shell为bash: 如果有,就显示有多少个这类用户:否则,就显示没有这类用户: #!/bin/bash # grep '\<bash$' /et ...

  9. MySQL 日期时间函数

    目录 datetime和timestamp区别: timestamp类型字段特殊性: Mysql获取日期时间函数: now() curdate() curtime() Extract() last_d ...

  10. nowcoder 合并回文子串

    链接:https://www.nowcoder.com/acm/contest/6/C来源:牛客网题目输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc&q ...