运行java是提示 选择未包含 main 类型 如何解决_Pandas_操作数据集合基础 5.1 Pandas的数据结构简介(下):DataFrame类型...

Pandas作者:PureFFFmennory上一节:5.1 Pandas的数据结构简介(上):Series类型PureFFFmennory:Pandas_操作数据集合基础 5.1 Pandas的数据结构简介(上)​zhuanlan.zhihu.com注:本节代码开始均默认读者已经导入pandas(import pandas as pd),本系列文章的代码均在在python3.7环境下运行。5.1...
摘要由CSDN通过智能技术生成

Pandas

作者:PureFFFmennory

上一节:5.1 Pandas的数据结构简介(上):Series类型PureFFFmennory:Pandas_操作数据集合基础 5.1 Pandas的数据结构简介(上)​zhuanlan.zhihu.com849995eb8007d3d4f51f02f46caea35d.png

注:本节代码开始均默认读者已经导入pandas(import pandas as pd),本系列文章的代码均在在python3.7环境下运行。

5.1 Pandas的数据结构简介(上):DataFrame类型

DataFrame

DataFrame代表一个矩形数据表,并包含一个有序的列集合,每个列可以是不同类型的值(数字,字符串,布尔值等)。DataFrame同时具有行索引和列索引;可以将其视为所有共享相同索引的Series的dict。在后台,数据储存为一个或多个二维块,而不是列表,dict或其他一维数组的集合。DataFrame内部详细信息不在本文章的讨论范围之内。

注:虽然DataFrame在物理上是二维的,但你可以使用它通过分层索引以表格格式表示高维数据,我们将在后面提到,是Pandas中一些关于更高级的数据处理功能的组成部分。

构造DataFrame的方法有很多,尽管最常见的方法之一是用等长列表或NumPy数组的dict。

>> 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)

>> print(frame)

像Series一样,结果将自动分配索引于DataFrame,并且按排序顺序放置各列:

输出结果:

>>

pop state year

0 1.5 Ohio 2000

1 1.7 Ohio 2001

2 3.6 Ohio 2002

3 2.4 Nevada 2001

4 2.9 Nevada 2002

5 3.2 Nevada 2003

如果你用的是Jupyter笔记本,则Pandas的DataFrame对象将显示为对浏览器更友好的HTML表格。

对于大型DataFrame,head方法仅选择前5行:

>> print(frame.head())

输出结果:

>>

pop state year

0 1.5 Ohio 2000

1 1.7 Ohio 2001

2 3.6 Ohio 2002

3 2.4 Nevada 2001

4 2.9 Nevada 2002

如果你指定列的顺序,则DataFrame的列将按一下的顺序排列:

>> print(pd.DataFrame(data, columns=['year', 'state', 'pop']))

输出结果:

>>

year state pop

0 2000 Ohio 1.5

1 2001 Ohio 1.7

2 2002 Ohio 3.6

3 2001 Nevada 2.4

4 2002 Nevada 2.9

5 2003 Nevada 3.2

如果你传递一个dict中未包含的列,那么它将在结果中以缺失值的方式出现:

>> frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],

index=['one', 'two', 'three', 'four', 'five', 'six'])

>> print(frame2)

>> print(frame2.columns)

输出结果:

>>

year state pop debt

one 2000 Ohio 1.5 NaN

two 2001 Ohio 1.7 NaN

three 2002 Ohio 3.6 NaN

four 2001 Nevada 2.4 NaN

five 2002 Nevada 2.9 NaN

six 2003 Nevada 3.2 NaN

Index(['year', 'state', 'pop', 'debt'], dtype='object')

可以通过类似dict的符号或属性将DataFrame中的列检索为Series:

>> print(frame2['state'])

>> print(frame2.year)

输出结果:

>>

one Ohio

two Ohio

three Ohio

four Nevada

five Nevada

six Nevada

Name: state, dtype: object

one 2000

two 2001

three 2002

four 2001

five 2002

six 2003

Name: year, dtype: int64

注:为方便起见,这里类属性的访问(如frame2.year)和列名的制表符访问均被Python接受。frame2[column]适用于任何列名,但是frame2.column仅在列名有效时才可访问。

这里我们返回的Series与DataFrame具有相同的索引,并且已经正确设置了它们的name属性。

还可以通过具有特殊loc属性的位置或名称来检索行(稍后将对此进行更多介绍):

>> print(frame2.loc['three'])

输出结果:

>>

year 2002

state Ohio

pop 3.6

debt NaN

Name: three, dtype: object

列可以通过分配修改,例如,可以为空的'debt'列分配标量值或数组:

>> frame2['debt'] = 16.5

>> print(frame2)

>>

>> frame2['debt'] = np.arange(6.)

>> print(frame2)

输出结果:

>>

year state pop debt

one 2000 Ohio 1.5 16.5

two 2001 Ohio 1.7 16.5

three 2002 Ohio 3.6 16.5

four 2001 Nevada 2.4 16.5

five 2002 Nevada 2.9 16.5

six 2003 Nevada 3.2 16.5

year state pop debt

one 2000 Ohio 1.5 0.0

two 2001 Ohio 1.7 1.0

three 2002 Ohio 3.6 2.0

four 2001 Nevada 2.4 3.0

five 2002 Nevada 2.9 4.0

six 2003 Nevada 3.2 5.0

当你将列表或数组分配给列时,该值的长度必须与DataFrame的长度匹配。如果你分配一个Series,则其标签将完全与DataFrame的索引对齐,从而在所有有“孔”的地方插入缺失值:

>> val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])

>> frame2['debt'] = val

>> print(frame2)

输出结果:

>>

year state pop debt

one 2000 Ohio 1.5 NaN

two 2001 Ohio 1.7 -1.2

three 2002 Ohio 3.6 NaN

four 2001 Nevada 2.4 -1.5

five 2002 Nevada 2.9 -1.7

six 2003 Nevada 3.2 NaN

分配不存在的列将创建一个新列,与dict一样,del关键字将删除列。

作为del的示例,我首先添加一个新的布尔值列,其中state列等于'Ohio':

>> frame2['eastern'] = frame2.state == 'Ohio'

>> print(frame2)

输出结果:

>>

year state pop debt eastern

one 2000 Ohio 1.5 NaN True

two 2001 Ohio 1.7 -1.2 True

three 2002 Ohio 3.6 NaN True

four 2001 Nevada 2.4 -1.5 False

five 2002 Nevada 2.9 -1.7 False

six 2003 Nevada 3.2 NaN False

注:新列的创建不能用frame2.eastern的语法。

然后可以使用del方法删除此列:

>> del frame2['eastern']

>> print(frame2.columns)

输出结果:

>>

Index(['year', 'state', 'pop', 'debt'], dtype='object')

注:从索引DataFrame返回的列是基础数据的view,而不是副本。因此,对Series的任何就地修改都将反映在DataFrame中。该列可以使用Series的copy方法显式的复制。

数据的另一种常见形式是dict的嵌套:

>> pop = {'Nevada': {2001: 2.4, 2002: 2.9},

'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}

如果将嵌套的dict传递到DataFrame,那么pandas会将外部dict键解释为列,内部键解释为行:

>> frame3 = pd.DataFrame(pop)

>> print(frame3)

输出结果:

>>

Nevada Ohio

2000 NaN 1.5

2001 2.4 1.7

2002 2.9 3.6

你可以使用与NumPy数组类似的语法进行转置DataFrame(交换行于列):

>> frame3.T

输出结果:

>>

2000 2001 2002

Nevada NaN 2.4 2.9

Ohio 1.5 1.7 3.6

dict内部的键被组合并排序以形成结果中的索引。如果指定了显式索引,则情况将并非如此:

>> print(pd.DataFrame(pop, index=[2001, 2002, 2003]))

输出结果:

>>

Nevada Ohio

2001 2.4 1.7

2002 2.9 3.6

2003 NaN NaN

Series的dict的处理方式大致相同:

>> pdata = {'Ohio': frame3['Ohio'][:-1],

'Nevada': frame3['Nevada'][:2]}

>> print(pd.DataFrame(pdata))

输出结果:

>>

Nevada Ohio

2000 NaN 1.5

2001 2.4 1.7

有关可以传递DataFrame构造函数的完整列表如下:

如果DataFrame的索引和列设置其name属性,则还将显示以下内容:

>> frame3.index.name = 'year'

>> frame3.columns.name = 'state'

>> print(frame3)

输出结果:

>>

state Nevada Ohio

year

2000 NaN 1.5

2001 2.4 1.7

2002 2.9 3.6

与Series一样,values属性以二维ndarry的形式返回DataFrame中包含的数据:

>> print(frame3.values)

输出结果:

>>

array([[ nan, 1.5],

[ 2.4, 1.7],

[ 2.9, 3.6]])

如果DataFrame的列是不同的dtype,则将选择values数组的dtype来容纳所有列:

>> print(frame2.values)

输出结果:

>>

array([[2000, 'Ohio', 1.5, nan],

[2001, 'Ohio', 1.7, -1.2],

[2002, 'Ohio', 3.6, nan],

[2001, 'Nevada', 2.4, -1.5],

[2002, 'Nevada', 2.9, -1.7],

[2003, 'Nevada', 3.2, nan]], dtype=object)

索引对象

pandas的索引(index)对象负责保存轴标签和其他元数据(例如轴名称)。构造Series或DataFrame时使用的任何数组或其他标签序列都在内部转换为Index:

>> obj = pd.Series(range(3), index=['a', 'b', 'c'])

>> index = obj.index

>> print(index)

>> print(index[1:])

输出结果:

>>

Index(['a', 'b', 'c'], dtype='object')

Index(['b', 'c'], dtype='object')

Index对象是不可变的,因此用户无法对其进行修改:

>> index[1] = 'd' # TypeError

不变性使它在数据结构之间共享Index对象更加安全:

>> labels = pd.Index(np.arange(3))

>> print(labels)

>>

>> obj2 = pd.Series([1.5, -2.5, 0], index=labels)

>> print(obj2)

>>

>> print(obj2.index in labels)

输出结果:

>>

Int64Index([0, 1, 2], dtype='int64')

0 1.5

1 -2.5

2 0.0

dtype: float64

True

有些用户通常不会利用索引提供的功能,但是由于某些操作会产生包含索引数据的结果,因此了解它们的工作方式非常重要。

除了像数组一样,索引的行为还类似于固定大小的集合:

>> print(frame3)

>>

>> print(frame3.columns)

>>

>> print('Ohio' in farme3.columns)

>>

>> print(2003 in frame3.index)

输出结果:

>>

state Nevada Ohio

year

2000 NaN 1.5

2001 2.4 1.7

2002 2.9 3.6

Index(['Nevada', 'Ohio'], dtype='object', name='state')

True

False

与Python集合不同,pandas索引可以包含重复标签:

>> dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])

>> print(dup_labels)

输出结果:

>>

Index(['foo', 'foo', 'bar', 'bar'], dtype='object')

具有重复标签的选择将选择所有出现的标签:

每个索引都有许多用于设置逻辑的方法和属性,这些逻辑可以回答有关其包含的数据的其他常见问题,见下表:

下一节:Pandas的基本重要功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值