3.3 数据取值与选择

本文介绍了如何在Python的Pandas库中进行数据取值与选择,包括Series和DataFrame两种数据结构。对于Series,可以视其为字典或一维数组,并利用索引来切片。DataFrame则可以理解为字典的集合或二维数组,注意列名需为字符串以避免与内置属性冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.3 数据取值与选择

Series

将Series看作字典

 

import pandas as pd
data = pd.Series([0.25, 0.5, 0.75, 1], index=['a', 'b', 'c', 'd'])
data
a    0.25
b    0.50
c    0.75
d    1.00
dtype: float64

 

# 键引用
data['b']
0.5

 

'a' in data
True

 

data.keys()
Index(['a', 'b', 'c', 'd'], dtype='object')

 

list(data.items())
[('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]

 

# 用字典方式添加新数据元素
data['e'] = 1.25
data
a    0.25
b    0.50
c    0.75
d    1.00
e    1.25
dtype: float64

将Series看作一维数组

 

# 将显式索引作为切片,最后的索引也会切片进来
data['a':'c']
a    0.25
b    0.50
c    0.75
dtype: float64

 

# 将隐式整数索引作为切片
data[0:2]
a    0.25
b    0.50
dtype: float64

 

# 掩码
data[(data > 0.3) & (data < 0.8)]
b    0.50
c    0.75
dtype: float64

 

# 花哨的索引
data[['a', 'e']]
a    0.25
e    1.25
dtype: float64

将显式索引作为切片,最后的索引也会切片进来。如果显式的索引本身也是数字,就会和隐式数字索引混淆,因此有索引器方法。

 

data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])
data
1    a
3    b
5    c
dtype: object

 

# 取值操作是显式索引
data[1]
'a'

 

# 切片操作是隐式索引,左闭右开的python式
data[1:3]
3    b
5    c
dtype: object

 

# 索引器1 loc属性,取值和切片都是显式
data.loc[1]
'a'

 

data.loc[1:3]
1    a
3    b
dtype: object

 

# 索引器2 iloc属性,取值和切片都是隐式,左闭右开的python式
data.iloc[1]
'b'

 

data.iloc[1:3]
3    b
5    c
dtype: object

DataFrame

将DF看作字典,由若干Series对象构成的字典

 

area_dict = {'e': 50, 'b': 46, 'c': 66, 'd': 211}
area = pd.Series(area_dict)
popu_dict={'e': 6622, 'b': 5644, 'c': 9022, 'd': 1222111}
popu = pd.Series(popu_dict)
data = pd.DataFrame({'area': area, 'popu': popu})
data
 areapopu
e506622
b465644
c669022
d2111222111

 

# 两个Series分别构成DF的一列
# 可用列名进行字典式取值获取数据
data['area']
e     50
b     46
c     66
d    211
Name: area, dtype: int64

 

# 也可用属性形式选择纯字符串列名的数据
data.area
e     50
b     46
c     66
d    211
Name: area, dtype: int64

 

# 两种方式结果相同
data.area is data['area']
True

属性方式的局限性:列名不是字符串,或列名与内置属性相同,则不能用

 

# 可用字典形式的语法调整对象,如添加一列
data['density'] = data['popu']/data['area']
data
 areapopudensity
e506622132.440000
b465644122.695652
c669022136.696970
d21112221115791.995261

将DF看作二维数组

 

# 用value属性查看数据
data.values
array([[5.00000000e+01, 6.62200000e+03, 1.32440000e+02],
       [4.60000000e+01, 5.64400000e+03, 1.22695652e+02],
       [6.60000000e+01, 9.02200000e+03, 1.36696970e+02],
       [2.11000000e+02, 1.22211100e+06, 5.79199526e+03]])

 

# 获得行列转置
data.T
 ebcd
area50.0046.00000066.000002.110000e+02
popu6622.005644.0000009022.000001.222111e+06
density132.44122.695652136.696975.791995e+03

 

data
 areapopudensity
e506622132.440000
b465644122.695652
c669022136.696970
d21112221115791.995261

 

# 用索引器取值
# iloc索引器,python式前闭后开取值,索引为隐式数字
data.iloc[:3, :2]
 areapopu
e506622
b465644
c669022

 

# loc索引器,前闭后闭取值,索引为显式字符串
data.loc[:'b', :'popu']
 areapopu
e506622
b465644

 

# ix索引器,为混合效果,易混淆,不建议使用
data.ix[:3, :'popu']
c:\program files\python36-32\lib\site-packages\ipykernel_launcher.py:2: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  
 areapopu
e506622
b465644
c669022

 

# 任何用于np数据的方法都可用于索引器,如结合掩码和花哨
data.loc[data.density > 130, ['popu', 'density']]
 popudensity
e6622132.440000
c9022136.696970
d12221115791.995261

 

# 任何取值方法都可以修改数据,与np的方法相同
data.iloc[0, 2] = 90
data
 areapopudensity
e50662290.000000
b465644122.695652
c669022136.696970
d21112221115791.995261

其他取值方法

 

# 单个标签取值,就获得列,要用列标签
data['area']
e     50
b     46
c     66
d    211
Name: area, dtype: int64

 

# 多个标签取值,就获得行,要用行标签
data['b':'d']
 areapopudensity
b465644122.695652
c669022136.696970
d21112221115791.995261

 

# 切片也可以不用索引值,直接用行数。前闭后开。
data[1:3]
 areapopudensity
b465644122.695652
c669022136.696970

 

# 掩码操作也可以直接对每行过滤,而不用loc索引器
data[data.density > 130]
 areapopudensity
c669022136.696970
d21112221115791.995261
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值