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

时间: 2024-10-24 18:18:26

Python数据分析-Day2-Pandas模块的相关文章

Python数据分析之pandas学习

Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利用pandas的DataFrames进行统计分析5.利用pandas实现SQL操作6.利用pandas进行缺失值的处理7.利用pandas实现Excel的数据透视表功能8.多层索引的使用 一.数据结构介绍 在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame.Ser

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

Python 数据分析:Pandas 缺省值的判断 背景 我们从数据库中取出数据存入 Pandas None 转换成 NaN 或 NaT.但是,我们将 Pandas 数据写入数据库时又需要转换成 None,不然就会报错.因此,我们就需要处理 Pandas 的缺省值. 样本数据 id name password sn sex age amount content remark login_date login_at created_at 0 1 123456789.0 NaN NaN NaN 20

【Python数据分析】pandas时期period

目录 1.pandas模块之period 1.1 period创建时期 1.2 period_range创建时期范围 1.3 asfreq频率转换 1.4 时间戳与日期之间转换 1.pandas模块之period 1.1 period创建时期 import pandas as pd # pd.Period()创建时期 p = pd.Period('2017', freq = 'M') print(p, type(p)) # 生成一个以2017-01开始,月为频率的时间构造器 # pd.Perio

python数据分析工具——Pandas、StatsModels、Scikit-Learn

Pandas Pandas是 Python下最强大的数据分析和探索工具.它包含高级的数据结构和精巧的工具,使得在 Python中处理数据非常快速和简单. Pandas构建在 Numpy之上,它使得以 Numpy为中心的应用很容易使用.Pandas的功能非常强大,支持类似于SQL的数据增.删.查.改,并且带有丰富的数据处理函数;支持时间序列分析功能;支持灵活处理缺失数据等. Pandas的安装相对来说比较容易,安装好 Numpy之后,就可以直接安装了,通过pip install pandas或下载

【Python 数据分析】Numpy模块

Numpy模块可以高效的处理数据,提供数组支持.很多模块都依赖他,比如:pandas.scipy.matplotlib 安装Numpy 首先到网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/下查找numpy+mkl 我的Python版本是3.6.1,系统是64位 所以对应下载的包为: 下载好包之后,进入到包所在目录(例如:D:\安装包\安装包~Python\numpy-1.13.3+mkl-cp36-cp36m-win_amd64.whl) 使用如下命

python数据分析之Pandas:基本功能介绍

Pandas有两个主要的数据结构:Series和DataFrame. Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签构成.来看下它的使用过程 In [1]: from pandas import Series,DataFrame In [2]: import pandas as pd In [3]: obj=Series([4,7,-5,3]) In [5]: obj Out[5]: 0    4 1    7 2   -5 3    3 dtype: int64

python数据分析之pandas库的DataFrame应用二

本节介绍Series和DataFrame中的数据的基本手段 重新索引 pandas对象的一个重要方法就是reindex,作用是创建一个适应新索引的新对象 ''' Created on 2016-8-10 @author: xuzhengzhu ''' ''' Created on 2016-8-10 @author: xuzhengzhu ''' from pandas import * print "--------------obj result:-----------------"

python数据分析之pandas库的DataFrame应用

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔型).DateFrame既有行索引也有列索引,可以被看作为由Series组成的字典. 构建DataFrame: 1.1.直接传入一个由等长列表或numpy数组组成的字典 ''' Created on 2016-8-10 @author: xuzhengzhu ''' from pandas import * data={'state':['ohio','ohio','ohio','nevada

安装 python 数据分析插件 pandas

一上午试验了各种方法,发现利用pycharm是最快的.可以抛弃版本,命令和兼容问题的烦恼.纯粹傻瓜式 方法是 pycharm, 直接在settings里面,搜索pandas,添加即可,他会把所有之前需要安装的加进去 另外需要注意的,有一个version,即当前version,latest version,最新version,最好都在安装其他package前,检查当前version,是不是最新的

Python数据分析(二): Pandas技巧 (2)

Pandas的第一部分: http://www.cnblogs.com/cgzl/p/7681974.html github地址: https://github.com/solenovex/My-Machine-Learning-Notebook 很抱歉, 因为工作繁忙, 更新的比较慢. 数据的选取和索引 Pandas对数据的基本操作