Python数据分析(二)—— Pandas快速入门

简介: Python数据分析(二)—— Pandas快速入门

Pandas是基于NumPy的数据分析包,兼具NumPy高性能的数组计算功能以及电子表格和关系型数据库(SQL)灵活的数据处理功能,提供了大量快速处理数据的方法以及适用于金融数据的高性能时间序列功能和工具。


Pandas的名称来自于Panel data和Python data analysis,最初由AQR Capital Management在2008年4月作为金融数据分析工具开发出来,并于2009年底开源,目前由PyData开发和维护。


MovieLens(https://movielens.org/ )美国Minnesota 大学计算机科学与工程学院的 GroupLens 项目组(https://grouplens.org ) 创办,是一个非商业性质的、以研究为目的的实验性站点,通过使用 Collaborative Filtering 和 Association Rules 相结合的技术,向用户推荐他们感兴趣的电影。


MovieLens数据集(http://files.grouplens.org/datasets/movielens/ ) 是GroupLens 项目组采集的一组从20世纪90年代末到21世纪初由MovieLens用户提供的电影评分数据,该数据集包括电影评分、电影元数据(时间与类型)以及关于用户的数据(年龄、性别、职业、邮编)。


本文使用MovieLen 1M版本(m1-1m.zip),该数据集包括三个文件:用户信息、影片信息(1919-200年的3883部电影)、评分信息,readme为说明文件,包括了年龄和职业的编码说明。


1 数据加载


pandas通过以下方法将数据加载到pandas的DataFrame对象中:


read_csv 默认分隔符为逗号

read_table 默认分隔符为制表符(\t)

主要参数如下:


path: 文件的系统路径

sep或delimiter: 对各字段拆分的字符序列或正则表达式

index_col: 行索引的列编号或列名

names: 列名的列表

parse_dates: 尝试将数据解析为日期(默认False)

encoding: 文本编码格式(utf-8, gb18030, gb2312),文件中中文需要使用encoding='gb18030'或encoding='gb2312'

engine:路径中有中文需要使用engine='python'


2 数据探索


(1)Series


Series是一种类似于一维数组的对象,由一组数据及一组与之相关的数据标签(索引)组成。通过一组数组可产生最简单的Series


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


进行NumPy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数据函数等)都会保留索引和值之间的链接,如


obj[obj>2]


Series对象本身及其索引都有一个name属性,可以对其进行赋值。


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


c64d71ee5eef4ad3bfa9f83dfce9e84f.png



(2) DataFrame


DataFrame是一个表格型的数据结构(面向列的二维表),含有一组有序的列,每列可以是不同的值类型;既有行索引也有列索引,可看做由Series组成的字典。

#查看数据整体信息
users.info()
#查看数据统计相关信息,包括最大、最小、平均值、标准差等
users.describe()
#查看用户数据前5行
users.head()
users[:5]
users.iloc[:5] #通过行号索引行数据
users.loc[:4]  #通过行标签索引数据
# 查看数据第5行
users.iloc[5]
users.loc[5]
# 按照步长查看特定行
users[1:5:2] #(start:end-1:step)
users.iloc[1:5:2] #(start:end-1:step)
users.loc[1:5:2] #(start:end:step)
# 根据条件选择特定行
users[(users.age>50)&(users.sex=='F')]
movies[movies.title.str.contains('Titanic')]
# 选定一组列
users.iloc[:,1:4]
users[['sex','age']]


3 数据合并


(1) merge


merge可根据一个或多个键将不同DataFrame中的行连接起来(类似于SQL中join操作)。默认情况下,merge做的是inner连接,结果中的键是交集,其他方式还有left、right以及outer。outer(外连接)求取的是键的并集,组合了左连接和右连接的效果。

pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False)

主要参数如下:


left: 参与合并的左侧DataFrame

right: 参与合并的右侧DataFrame

how: inner/outer/left/right,默认inner

on: 用于连接的列名,若不指定,将重叠列的列名当做键

left_on: 左侧DataFrame中用作连接键的列

right_on: 右侧DataFrame中用作连接键的列

left_index: 左侧行索引作为连接键

right_index: 右侧行索引作为连接键


data = pd.merge(pd.merge(users,ratings),movies)
data.head()

4214a83f2ee24091950c11d608fa8ff9.png

data[(data.age>=30)&(data.age<40)][["uid","sex","age"]]

d17421cfc6ab4840a002c8c05680a6c4.png


(2)concat


concat方法将两个对象按指定轴连接(concatenation),这个过程也被称作绑定(binding)或堆叠(stacking)。


concat默认是在**axis=0(row)**上进行连接(类似于SQL中union all操作),axis=1(column)。


pd.concat([df1,df2])等同于 df1.append(df2)

pd.concat([df1,df2],axis=1)等同于 pd.merge(df1,df2,left_index=True,right_index=True,how='outer')

主要参数如下:


objs:Series,DataFrame或Panel对象的序列或映射。如果传递了dict,则排序的键将用作键参数,除非它被传递,在这种情况下,将选择值(见下文)。任何无对象将被静默删除,除非它们都是无,在这种情况下将引发一个ValueError。

axis:连接轴向,默认为0

join:{‘inner’,‘outer’},默认为“outer”

ignore_index:不保留连接轴上的索引,产生一组新索引range(total_length),默认False。

join_axes:Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。

keys:序列,默认值无。使用传递的键作为最外层构建层次haunted索引。如果为多索引,应该使用元组。

levels:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。

names:结果层次索引中的级别的名称。

verify_integrity:检查新连接的轴是否包含重复项

df1 = pd.DataFrame(np.arange(8).reshape(2,4))
df2 = pd.DataFrame(np.arange(12).reshape(3,4))
pd.concat([df1,df2])

a8989e5bb39849599c5dd91584198645.png

pd.concat([df1,df2],axis=1)

536be2d241c041b39d68b48af0d949fd.png

(3)join


join方法提供了两个DataFrame基于索引的连接,其中参数的意义与merge方法基本相同,join方法默认为左外连接how=‘left’。


df1.join(df2,lsuffix = '_df1')


15974f9dd6294eb1bd21b2b9a80d1e5d.png

4 数据处理


(1)去重


drop_duplicates返回一个移除了重复行的DataFrame,默认保留第一个出现的值组合。


(2)数据转换


map接受一个函数或含有映射关系的字典型对象,实现元素级转换。

replace提供了一种更简单灵活的方式。

data = pd.DataFrame({'gender':['F','F','M','M','F','M',]})
mapTran = {'F':0,'M':1}
data.gender.map(mapTran)  # 使用map函数 
data.gender.replace(mapTran)  #使用replace函数


(3)缺失值处理


pandas使用浮点值NaN(Not a Number)表示浮点和非浮点数组中的缺失数据。


dropna:根据个标签的值中是否存在缺失数据对轴标签(默认axis=0,丢弃列传入axis=1)进行过滤。默认丢弃任何含有缺失值的行,传入how='all'

fillna:使用指定值或插值方法填充缺失数据,默认返回新对象。

isnull:返回一个含有布尔值的对象,表示那些只是缺失值


通过字典调用fillna,可实现对不同的列填充不同的值,可以看做replace的一种特殊情况,如


df.fillna({'tz':'missing'})


(4)apply方法


每部电影的上映时间包含在title字段中,如’One Flew Over the Cuckoo’s Nest (1975)’,可以通过使用一个lambda函数提取出上映时间:


movies['year'] = movies.title.apply ( lambda x : x [- 5 :- 1 ])  # 分析电影时间



(5)计算哑变量


机器学习中常将分类变量(categorical variable)转换为“哑变量矩阵”(dummy matrix)或“指标矩阵”(indicator matrix)。如果DataFrame的某一列中有k kk个不同值,则可以派生出一个k列矩阵或DataFrame(其值全为0和1)。可以使用get_dummies。


df = pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
pd.get_dummies(df['key'])


b32ffd34f76447488ba1f2d60cca4131.png

每部电影有多个类型标签,如Saving Private Ryan (1998)同属于Action|Drama|War三种类型。首先构建一个所有电影类型的列表genre;然后初始化一个全零的DataFrame,通过使用enumerate方法遍历电影类型,将DataFrame对应行列的值置为1,进行One-hot encoding,并连接形成新的DataFrame。


# 分析电影类型
genre_iter = [set(x.split('|')) for x in movies.genres]
genre = sorted(set.union(*genre_iter))
genre_matrix = pd.DataFrame(np.zeros((len(movies),len(genre))),columns=genre)
for i,gen in enumerate(movies.genres):
    genre_matrix.loc[i][gen.split('|')] = 1
movies_new = movies.join(genre_matrix)


(6)离散


连续数据常常被离散化,使用cut或qcut。qcut使用的是样本分位数,可以得到大小基本相当的区间。

ages = [20,22,25,27,21,24,37,21,31,61,45,41,32]
bins = [18,30,50,100]
ages_cut = pd.cut(ages,bins)
ages_cut.codes  #每个分类名称
pd.value_counts(ages_cut) #不同面元的计数

94ce87e8acbb42c1b48231a1a66dd799.png

(7)排序


要对行或列索引进行排序(按字典排序),可使用sort_values方法(sort_index已废弃),返回一个已排序的新对象。

要对多个列进行排序,传入名称的列表即可。

movies.sort_values(by = ['genres','title'])[:5]


数据默认是升序排序的,使用ascending=False可以降序排序。默认axis=0对行(row)进行排序,使用axis=1对列(column)进行排序。

reindex方法会根据新索引对数据进行重排,使用columns关键字可重新索引列;rename方法可以重命名行列名。

frame = pd.DataFrame(np.arange(12).reshape(4,3),index=['a','b','c','d'],columns=['Ohio','Texas','Cali'])
frame


74ec81166a054352a9395a51704eedb4.png

frame.reindex(['a','c','b','d'],columns=['Cali','Texas','Ohio'])

8b3df574e43b4a449db47902fe0532f7.png

frame.rename(columns={'Cali':'C'}) #重命名

9f80691c8b7b43ab8183be861897b924.png

相关文章
|
7月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
569 0
|
7月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
704 0
|
10月前
|
自然语言处理 数据挖掘 数据处理
告别低效代码:用对这10个Pandas方法让数据分析效率翻倍
本文将介绍 10 个在数据处理中至关重要的 Pandas 技术模式。这些模式能够显著减少调试时间,提升代码的可维护性,并构建更加清晰的数据处理流水线。
344 3
告别低效代码:用对这10个Pandas方法让数据分析效率翻倍
|
数据采集 数据可视化 数据挖掘
Pandas数据应用:天气数据分析
本文介绍如何使用 Pandas 进行天气数据分析。Pandas 是一个强大的 Python 数据处理库,适合处理表格型数据。文章涵盖加载天气数据、处理缺失值、转换数据类型、时间序列分析(如滚动平均和重采样)等内容,并解决常见报错如 SettingWithCopyWarning、KeyError 和 TypeError。通过这些方法,帮助用户更好地进行气候趋势预测和决策。
487 71
|
9月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
741 0
|
11月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
597 1
|
存储 数据采集 数据可视化
Pandas数据应用:电子商务数据分析
本文介绍如何使用 Pandas 进行电子商务数据分析,涵盖数据加载、清洗、预处理、分析与可视化。通过 `read_csv` 等函数加载数据,利用 `info()` 和 `describe()` 探索数据结构和统计信息。针对常见问题如缺失值、重复记录、异常值等,提供解决方案,如 `dropna()`、`drop_duplicates()` 和正则表达式处理。结合 Matplotlib 等库实现数据可视化,探讨内存不足和性能瓶颈的应对方法,并总结常见报错及解决策略,帮助提升电商企业的数据分析能力。
759 73
|
Python
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
243 3
|
存储 数据采集 数据可视化
Pandas数据应用:医疗数据分析
Pandas是Python中强大的数据操作和分析库,广泛应用于医疗数据分析。本文介绍了使用Pandas进行医疗数据分析的常见问题及解决方案,涵盖数据导入、预处理、清洗、转换、可视化等方面。通过解决文件路径错误、编码不匹配、缺失值处理、异常值识别、分类变量编码等问题,结合Matplotlib等工具实现数据可视化,并提供了解决常见报错的方法。掌握这些技巧可以提高医疗数据分析的效率和准确性。
592 22
|
数据采集 数据可视化 索引
Pandas数据应用:股票数据分析
本文介绍了如何使用Pandas库进行股票数据分析。首先,通过pip安装并导入Pandas库。接着,从本地CSV文件读取股票数据,并解决常见的解析错误。然后,利用head()、info()等函数查看数据基本信息,进行数据清洗,处理缺失值和重复数据。再者,结合Matplotlib和Seaborn进行数据可视化,绘制收盘价折线图。最后,进行时间序列分析,设置日期索引、重采样和计算移动平均线。通过这些步骤,帮助读者掌握Pandas在股票数据分析中的应用。
906 5

热门文章

最新文章

推荐镜像

更多