dataframe数组做元素_访问和提取DataFrame中的元素

本文详细介绍了如何在Pandas DataFrame中通过各种方式访问和提取元素,包括属性运算符、索引运算符、loc、iloc以及at和iat函数的用法,帮助开发者高效操作DataFrame。

访问元素和提取子集是数据框的基本操作,在pandas中,提供了多种方式。对于一个数据框而言,既有从0开始的整数下标索引,也有行列的标签索引>>> df = pd.DataFrame(np.random.randn(4, 4), index=['r1', 'r2', 'r3', 'r4'], columns=['A', 'B', 'C', 'D'])>>> df           A B C Dr1 -0.220018 -0.398571 0.109313 0.186309r2 -1.416611 0.826713 0.178174 0.117015r3 -0.640207 -0.105941 -0.139368 -1.159992r4 -2.254314 -1.228511 -2.080118 -0.212526利用这两种索引,可以灵活的访问数据框中的元素,具体的操作方式有以下几种

1. 属性运算符

数据框的每一列是一个Series对象,属性操作符的本质是先根据列标签得到对应的Series对象,再根据Series对象的标签来访问其中的元素,用法如下# 第一步,列标签作为属性,先得到Series对象>>> s = df.A>>> sr1 -0.220018r2 -1.416611r3 -0.640207r4 -2.254314Name: A, dtype: float64# 第二步,在根据下标或者标签访问Series对象中的元素>>> s.r1-0.22001819046457136>>> s[0]-0.22001819046457136# 属性操作符,一步法简写如下>>> df.A.r1-0.22001819046457136

属性操作符,一次只可以返回一个元素,适用于提取单列或者访问具体标量的操作。

2. 索引运算符

这里的索引运算符,有两种操作方式对列进行操作,用列标签来访问对应的列

对行进行切片操作

列标签的用法,支持单个或者多个列标签,用法如下# 单个列标签>>> df['A']r1 -0.220018r2 -1.416611r3 -0.640207r4 -2.254314Name: A, dtype: float64# 当然,你可以在列对应的Series对象中再次进行索引操作,访问对应元素>>> df['A']['r1']-0.22001819046457136>>> df['A'][0]-0.22001819046457136# 多个列标签>>> df[['A', 'B']]A Br1 -0.220018 -0.398571r2 -1.416611 0.826713r3 -0.640207 -0.105941r4 -2.254314 -1.228511

对行进行切片的操作,用法如下>>> df[:2]           A         B         C         Dr1 -0.220018 -0.398571  0.109313  0.186309r2 -1.416611  0.826713  0.178174  0.117015

索引操作符,一次只能访问数据框的一个维度,适用于仅操作一个维度的场景。需要注意的是,当对不存在的列标签设值时,并不会报错,会自动进行append操作,示例如下>>> df['E'] = 5>>> df           A B C D Er1 0.706160 0.097334 0.241069 -0.412934 5r2 -0.357353 1.053972 0.052277 -1.459352 5r3 0.341270 0.551733 2.637333 0.494495 5r4 1.506536 0.635737 1.083644 1.106261 5

另外,索引操作符支持布尔数组,本质是提取True对应的元素,本次示例如下>>>df = pd.DataFrame(np.random.randn(4, 4), index=['r1', 'r2', 'r3', 'r4'], columns=['A', 'B', 'C', 'D'])>>>df           A B C Dr1 0.254875  0.627368 -1.488750 -1.134972r2 -0.052981 -1.874639 -1.460659  1.020969r3 -2.046727  1.460599  0.808164 -1.015956r4 -0.385587  1.534610 -0.043623 -1.742118>>>(df.A > df.B) & (df.B < df.C)r1 Falser2 Truer3 Falser4 Falsedtype: bool>>>df[(df.A > df.B) & (df.B < df.C)]           A B C Dr2 -0.052981 -1.874639 -1.460659  1.0209693. loc

loc功能灵活且强大,提供了基于标签的访问方式,先操作行标签,再操作列标签,用法如下# 只提供一个标签,视为行标签>>> df.loc['r1']A -0.220018B -0.398571C 0.109313D 0.186309Name: r1, dtype: float64# 根据单个行列标签,访问对应元素>>> df.loc['r1','A']-0.22001819046457136# 也支持多个行列标签,用列表的写法>>> df.loc['r1', ['A', 'B']]A -0.220018B -0.398571# :冒号是所有标签的简写>>> df.loc[:,'A']r1 -0.220018r2 -1.416611r3 -0.640207r4 -2.254314

对于标签,支持切片操作,和python内置的切片规则不一样,loc的切片包含了终止点,用法如下>>> df.loc['r1':'r3', 'A':'C']           A         B         Cr1 -0.220018 -0.398571  0.109313r2 -1.416611  0.826713  0.178174r3 -0.640207 -0.105941 -0.139368

loc也支持布尔数组,本质是提取True对应的标签元素,用法如下# 布尔数组# True对应的标签为C和D>>>df.loc['r1'] > 0A FalseB FalseC TrueD TrueName: r1, dtype: bool# 利用布尔数组,提取C,D两列>>>df.loc[:, df.loc['r1'] > 0]           C Dr1 0.109313  0.186309r2 0.178174  0.117015r3 -0.139368 -1.159992r4 -2.080118 -0.212526# 最近构建布尔数组,来提取对应的行>>>s = pd.Series([False, False, True, True], ['r1', 'r2', 'r3', 'r4'])>>>sr1 Falser2 Falser3 Truer4 Truedtype: bool>>>df.loc[s, :]           A B C Dr3 -0.640207 -0.105941 -0.139368 -1.159992r4 -2.254314 -1.228511 -2.080118 -0.212526

loc还支持函数调用,比如一个lambda匿名函数,用法如下>>> df.loc[:, lambda df: ['A', 'B']]           A         Br1 -0.220018 -0.398571r2 -1.416611  0.826713r3 -0.640207 -0.105941r4 -2.254314 -1.228511

函数调用的本质是通过函数返回对应的标签,示例如下>>> def extract_cols(df):... return(df.columns[0:2])...>>> extract_cols(df)Index(['A', 'B'], dtype='object')>>>>>> df.loc[:, extract_cols]           A Br1 -0.220018 -0.398571r2 -1.416611  0.826713r3 -0.640207 -0.105941r4 -2.254314 -1.228511

在函数中,可以根据需要定义复杂的逻辑。需要注意的是,通过loc设置对应的值时,当key不存在时,会默认进行append操作,示例如下# r5并不存在,但是不会报错>>> df.loc['r5'] = 1# 自动追加了r5的内容>>> df           A B C Dr1 -0.220018 -0.398571 0.109313 0.186309r2 -1.416611 0.826713 0.178174 0.117015r3 -0.640207 -0.105941 -0.139368 -1.159992r4 -2.254314 -1.228511 -2.080118 -0.212526r5 1.000000 1.000000 1.000000 1.000000

4. iloc

与loc相对应, iloc提供了基于下标索引访问元素的方式,用法和loc相同,只是将标签替换成了下标索引,示例如下# 单个索引,视为行索引>>> df.iloc[0]A   -0.220018B   -0.398571C    0.109313D    0.186309Name: r1, dtype: float64# 单个行列索引>>> df.iloc[0, 0]-0.22001819046457136# 多个行列索引>>> df.iloc[[0, 1], [0, 1, 2]]           A         B         Cr1 -0.220018 -0.398571  0.109313r2 -1.416611  0.826713  0.178174# 索引切片>>> df.iloc[:2, :2]           A         Br1 -0.220018 -0.398571r2 -1.416611  0.826713# 函数调用>>> df.iloc[:, lambda df: [0, 1]]           A         Br1 -0.220018 -0.398571r2 -1.416611  0.826713r3 -0.640207 -0.105941r4 -2.254314 -1.228511

5. at系列函数

上述几种方式都可以访问单个元素,但是由于考虑了很多的功能,其访问速度并不是最快的。针对访问单个元素的常见,pandas推荐使用at和iat函数,其中at使用标签进行访问,iat使用位置索引进行访问,用法如下>>> df.at['r1', 'A']-0.22001819046457136>>> df.iat[0, 0]-0.22001819046457136

pandas中访问元素的具体方法还有很多,熟练使用行列标签,位置索引,布尔数组这三种基本的访问方式,就已经能够满足日常开发的需求了。·end·

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值