python-for-data-analysis_2nd 第五章 pandas入门

本章介绍了pandas的基础知识,包括Series和DataFrame数据结构,以及索引对象的使用。重点讲解了数据选取、算术运算和数据对齐,还涉及DataFrame与Series之间的运算、函数应用、排序排名、统计计算和数据可视化等方面。此外,还提到了如何在pandas和numpy之间转换,以及处理重复标签轴索引的方法。

第五章 pandas入门

pandas数据结构介绍

Series
  • Series类似于⼀维数组的对象。仅由⼀组数据即可产⽣最简单的Series。主要是Series 的values和index属性获取其数组表示形式和索引对象。
  • 与普通NumPy数组相⽐,你可以通过索引的⽅式选取Series中的单个或⼀组值。在用numpy做操作的时候,可以保留索引值。
  • Series是索引值到数据值的一个映射,它由⼀组数据(各种NumPy数据类型)以及⼀组与之相关的数据标签(即索引)组成。
  • 字典可创建Series。修改键值(传入新的index)来改变顺序。
  • pandas中通过isnullnotnull来检测缺失数据。(第七章详谈
  • Series对象本身及其索引都有⼀个name属性,该属性跟pandas其他的关键功能关系⾮常密切
DataFrame
  • 表格型数据结构(数值、字符串、布尔值等)。
  • 行(index,我经常碰到的时间序列)列(columns,我之前一直叫列头)索引
  • head()选取前五列
  • 指定列序,则DataFrame的列就会按照指定顺序进⾏排列。
  • 位置属性来获取值(lociloc
  • 赋值更改
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],\
  'year': [2000, 2001, 2002, 2001, 2002, 2003],\
  'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)

frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four','five', 'six'])

frame2['debt'] = np.arange(6.) #赋值直接更改
  • 精准填充
 val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
 frame2['debt'] = val
  • 为不存在的列赋值会创建出⼀个新列。
 frame2['eastern'] = frame2.state == 'Ohio'#可以学一手,记一下就行,这种操作也不常用啊
  • 源修改(以上操作全都在原表上的操作);若不在原表上操作,就需要copy一份
 del frame2['eastern']#`del`删除列
 frame2.columns

  • 嵌套字典传给DataFrame,pandas就会被解释为:外层字典的键作为列索引(columns),内层键则作为⾏索引(index)
 pop = {'Nevada': {2001: 2.4, 2002: 2.9}, 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}

 frame3 = pd.DataFrame(pop)
 frame3

 frame3.T #转置
  • **values**将DataFrame转化为np.array,后面就可以进行numpy数组操作了!
索引对象

pandas的索引对象负责管理轴标签和其他元数据(⽐如轴名称等)。Index对象不可变

  • index可重复
重要功能
  • 重新索引reindex。(method=‘ffill’)使⽤ffill可以实现前向值填充
 obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
 obj3
 obj3.reindex(range(6), method='ffill')
  • 丢弃指定轴上的项(drop)传递axis=1axis='columns’可以删除列的值

在设置相关要求时inplace=True ⼩⼼使⽤inplace,它会销毁所有被删除的数据。

索引、选取和过滤
  • 第一种方式:直接按照**行列索引、[:3]**这种方式来找值
 data = pd.DataFrame(np.arange(16).reshape((4, 4)),index=['Ohio', 'Colorado', 'Utah', 'New York'],columns=['one', 'two', 'three','four'])

 data[data < 5] = 0#过滤选取值data<5直接是找表中的值小于5
  • 第二种方式:用loc[]iloc[]来进行选取
 data.loc['Colorado', ['two', 'three']]# 根据行列索引来找值(excel操作) 

 data.iloc[[1, 2], [3, 0, 1]]#同上类似操作
整数索引
  • 所以开发者强烈要求使用loc[]iloc[]
算术运算和数据对齐(重要功能:对不同索引的对象进行算数运算)
  • ⾃动的数据对⻬操作在不重叠的索引处引⼊了NA值。两个DataFrame和Series可以使用算术运算
在算术方法中填充值
  • 将它们相加时,没有重叠的位置就会产⽣NA值
算术方法说明
add,radd用于加法的操作
sub,rsub用于减法的操作
mul,rmul用于乘法的操作
div.rdiv用于除法的操作
pow,rpow指数运算
 df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)),columns=list('abcd'))
 df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)),columns=list('abcde'))

 df1.add(df2, fill_value=0)

 df1.reindex(columns=df2.columns, fill_value=0) # 关注reindex方法

🕸注意add和reindex都有fill_value这一属性。

DataFrame和Series之间的运算(两者有明确规定)
  • 下面实例(广播机制(每一行都执行这种操作))
 #np中array中的广播机制

 arr = np.arange(12.).reshape((3, 4))
 arr
 arr[0]
 arr - arr[0]

 #——————————————————————————————

 #pandas中DataFrame和Series的广播机制

 frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),
                   columns=list('bde'),
                   index=['Utah', 'Ohio', 'Texas', 'Oregon'])
 series = frame.iloc[0]

 frame - series

 #——————————————————————————————列上广播操作

 frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),\
                   columns=list('bde'),\
                   index=['Utah', 'Ohio', 'Texas', 'Oregon'])
 series = frame.iloc[:,0]
 print((frame.T - series).T)
  • 下面是分别实现行和列的广播机制小例子
 frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),\

 ​                     columns=list('bde'),\

 ​                     index=['Utah', 'Ohio', 'Texas', 'Oregon'])

 series=frame.iloc[0]

 series3 = frame['d']

 print(frame.sub(series, axis='columns'))
 print(frame.sub(series3,axis='index'))
补充知识点:pandas向numpy之间的转换
 arr= pd.Series([1.5, -2.5, 0])
 np__ar=arr.values               #values就可以实现,然后就可以进行数组运算
函数应用和映射
  • apply方法
 #该功能可以在一个数据表中找到一列(columns)中的最大值和最小值。

 frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),index=['Utah', 'Ohio', 'Texas', 'Oregon'])

 f = lambda x: x.max() - x.min()

 frame.apply(f)

 frame.apply(f, axis='columns')

 #该功能实现找到数据表中每一列的最大值和最小值,然后形成一个DataFrame

 def f(x):
  return pd.Series([x.min(), x.max()], index=['min', 'max'])
 frame.apply(f)

 #格式化字符串

 format = lambda x: '%.2f' % x

 frame.applymap(format)  #applymap 用于dataframe上,是**元素级别的操作**;

 frame['e'].map(format) #map 用于series上,是**元素级别的操作**。

🕸补充:许多常用的数组统计功能都被实现成DataFrame的方法(sum和mean),因此有时候无需使用apply方法

排序和排名
  • 根据条件对数据集排序(sorting)
    • sort_index()sort_values()
 #————————————sort_index()的用法

 frame = pd.DataFrame(np.arange(8).reshape((2, 4)),\

 ​                     index=['three', 'one'],\

 ​                     columns=['d', 'a', 'b', 'c'])

 frame.sort_index()

 frame.sort_index(axis=1,ascending=False)

 #————————————sort_values()的用法

 frame = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
 frame.sort_values(by='b')
  • 根据条件对数据集排名(rank)
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj.rank()

obj.rank(method='first')

obj.rank(ascending=False, method='max') #降序排名

frame = pd.DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1],\
                 'c': [-2, 5, 8, -2.5]})
frame.rank(axis='columns')
方法(method)说明
min使用分组中的最小排名
max使用分组中的最大排名
first值在原始数据中的出现顺序分配排名
带有重复标签的轴索引
 obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])

 obj.index.is_unique #查看索引是否唯一,返回布尔值

 df.mean(axis='columns', skipna=False)
汇总和计算描述统计(常见的数理统计的一些参数)
 df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],\
                 [np.nan, np.nan], [0.75, -1.3]],\
                index=['a', 'b', 'c', 'd'],\
                columns=['one', 'two'])
 #————————约简型
 df.sum()
 df.sum(axis='columns')
 df.mean(axis='columns', skipna=False)
 #————————
 df.idxmax() #切分数据表,可以找到每一区域内的最大的数据点(返回的是间接统计(如达到最值的索引))
 df.idxmin() #切分数据表,可以找到每一区域内的最小的数据点(返回的是间接统计(如达到最值的索引))
 #————————累计型
 df.cumsum() #累计值
 #————————汇总统计
 df.describe() #描述信息
  • 约简方法表
选项说明
axis约简的轴,0代表行,1代表列
skipna排除缺失值,默认为True
  • 描述和汇总统计
方法说明
count非NA值的数量
describe针对Series或各DataFrame列计算汇总统计
min,max计算最大值和最小值
argmin,argmax计算获取到最小值和最大值的索引位置(整数)
idxmin,idxmax计算能够获取到最小值和最大值的索引值
quantile计算样本的分位数(0到1)
sum值的总和
mean值的平均数
median值的算术中位数(50%分位数)
mad根据平均值计算平均绝对离差
var样本值的方差
std样本值的标准差
skew样本值的偏度(三阶矩)
kurt样本值的峰度(四阶矩)
cumsum样本值的累计和
cummin、cummax样本值的累计最大值和累计最小值
cumprod样本值的累计积
diff计算一阶差分(对时间序列很有用)
pct_change计算百分数变化

🕸其中describe()列举了count、mean、std、min、25%、50%、75%、max等信息。

🕸argmin()是numpy的操作。

相关系数和协方差
  • 此处涉及到pickle操作、时间序列中DataFrame.pct_change()、head()、tail()
  • corr()、cov()、corrwith()
 price = pd.read_pickle('examples/yahoo_price.pkl')
 volume = pd.read_pickle('examples/yahoo_volume.pkl')
 returns = price.pct_change()
 print(returns.tail())
 print(returns['MSFT'].corr(returns['IBM']))
 print(returns['MSFT'].cov(returns['IBM']))
 print(returns.corr())
 print(returns.cov())
 print(returns.corrwith(returns.IBM))
唯⼀值、值计数以及成员资格
  • 唯一值 unique()
  • 值计数value_counts()
  • isin()⽤于判断⽮量化集合的成员资格,可⽤于过滤Series中或DataFrame列中数据的⼦集。
  • isin() 类似方法Index.get_indexer()给你⼀个索引数组,从可能包含重复值的数组到另⼀个不同值的数组
 obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
 pd.value_counts(obj.values, sort=False)
 print(obj[obj.isin(['b', 'c'])].index)
 to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
 unique_vals=to_match.unique()
 print(pd.Index(unique_vals).get_indexer(to_match))
方法说明
isin两series找位置
match两series找位置,对于数据对齐和连接类型的操作十分有用
unique按发现顺序返回唯一值数组
value_counts返回series,索引唯一,值为频率,默认为降序排列(sort可更改)
补充内容:柱状图的绘制
 data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],\
                      'Qu2': [2, 3, np.nan, 2, 7],\
                      'Qu3': [1, 5, 2, 4, 4]})
 result = data.apply(pd.value_counts).fillna(0)
### 回答1: 《Python数据分析(第2版)》是由Wes McKinney著写的一本关于使用Python进行数据分析的书籍,第2版是其中文版本。这本书通过Python语言提供了一种简单、灵活、高效的方式来处理和分析数据。它主要涵盖了数据清洗、数据处理、数据可视化以及数据分析等方面的内容。 这本书的内容主要分为四个部分,分别是“准备工作”、“pandas入门”、“数据规整化”和“数据分析”的章节。 在“准备工作”部分,作者介绍了Python数据分析的环境设置,包括安装Python和相关的库(如NumPy和pandas)以及说明如何执行示例代码。 “pandas入门”一章介绍了pandas库的基本概念和常用操作,以及如何读取和处理各种数据格式。 “数据规整化”一章讨论了数据清洗和转换的技术,包括处理缺失值、重复数据以及重新组织数据等内容。 “数据分析”一章是这本书的核心部分,它介绍了如何使用Python进行数据分析,包括数据聚合、分组和透视等常用的数据分析方法。 这本书中通过许多实例和示例代码来演示如何使用Python进行数据分析,帮助读者理解和掌握数据分析的基本方法和技巧。它适合那些对数据分析感兴趣的读者,无论是初学者还是有一定经验的数据分析师。 总的来说,《Python数据分析(第2版)》是一本权威的、实用的关于使用Python进行数据分析的指南,它能够帮助读者快速入门并掌握数据分析的技巧。 ### 回答2: 《Python数据分析(第2版)中文版》是一本介绍使用Python进行数据分析的书籍。该书由Wes McKinney撰写,是第一本详细介绍使用Python进行数据分析的专业书籍。 这本书主要分为8个部分,涵盖了数据分析的基本概念、数据处理、数据可视化、时间序列分析等内容。第一部分介绍了数据分析的基本知识和工具,包括NumPy、Pandas和IPython等库和工具的使用。第二部分介绍了数据的处理和清洗,包括缺失数据的处理、数据合并和重塑等操作。第三部分重点介绍了数据的可视化,包括Matplotlib和Seaborn库的使用,可以帮助读者展示和分析数据。第四部分介绍了数据聚合和分组的方法,包括使用GroupBy、重塑和数据转换等技术。第五部分涵盖了时间序列数据的处理和分析。第六部分介绍了面板数据的处理。第七部分介绍了更高级的数据分析技术,包括移动窗口函数和爬虫技术等。第八部分介绍了常见的数据分析案例,通过实际的案例帮助读者理解和应用所学知识。 《Python数据分析(第2版)中文版》旨在帮助读者使用Python进行数据分析,提供了丰富的工具和案例,可以帮助读者掌握数据分析的基本技巧和方法。此外,该书还提供了在线的资源和教学视频,方便读者进一步学习和应用所学知识。 总之,《Python数据分析(第2版)中文版》是一本内容丰富、实用性强的书籍,对于想要学习和应用Python进行数据分析的读者来说是一本不可多得的工具书。 ### 回答3: 《Python 数据分析》(第二版)是一本讲述使用Python进行数据分析的书籍,由美国著名数据科学家Wes McKinney撰写。该书是McKinney首次出版的同名书籍的中文版,内容涵盖了一系列数据分析常用的Python工具和技术。 《Python 数据分析》(第二版)首先介绍了NumPy和Pandas两个Python数据分析库的基本用法。NumPy是一个强大的数值计算库,能够高效地处理大型数据集,而Pandas是一个建立在NumPy之上的数据分析工具,提供了更高级的数据结构和数据处理功能。 接着,该书讲解了如何使用Pandas进行数据清洗、变形和处理。Pandas提供了DataFrame和Series等数据结构,能够方便地对数据进行处理和操作。读者可以学习如何加载数据、处理缺失值、去重、切片、过滤、合并等操作。 书中还介绍了数据分析中常用的统计分析和可视化工具。读者可以学习如何使用Pandas和Matplotlib库进行数据的统计分析和可视化展示,包括生成各种图表和绘制统计图。 此外,《Python 数据分析》(第二版)还介绍了使用Pandas进行时间序列分析、数据聚合和加工等高级数据处理技术。读者可以学习如何处理时间序列数据、使用分组和聚合函数进行数据分析等。 总体来说,《Python 数据分析》(第二版)是一本很好的Python数据分析入门教程,适合对数据分析感兴趣的初学者。通过学习这本书,读者可以掌握使用Python进行数据分析的基本技能,并能够在实际项目中应用所学知识。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值