pandas DataFrame - 访问数据和遍历数据框
数据框是用于存储数据的二维结构,分为行和列,一行和一列的交叉位置是一个cell,该cell的位置是由行索引和列索引共同确定的。可以通过at/iat,或loc/iloc属性来访问数据框的元素,该属性后跟一个中括号:[row,col],中括号内 row表示行索引或行标签,col表示列索引或列标签。如果省略row, 那么row维度使用“:”代替,格式是 [ :, col] ,表示访问所有行的特定列;如果省略col ,格式是[row],表示访问特定行的所有列。
有以下数据框对象df,其数据和索引如下:
year state pop one 2000 Ohio 1.5 two 2001 Ohio 1.7 three 2002 Ohio 3.6 four 2001 Nevada 2.4 five 2002 Nevada 2.9
一,索引单个cell
通过元素的行和列索引对来访问单个cell,at 和 iat 属性只能访问当个cell,区别是at可以使用字符串和整数,而iat只能使用整数。
at 和 iat 的格式是:[row, column], 第一个维度是行索引,第二个维度是列索引。
通过iat属性(设置下标)来访问单个cell:
>>> df.iat[1,2]
1.7
通过at属性(设置标签)来访问单个cell:
>>> df.at['two','pop']
1.7
二,通过位置来访问多个元素
loc 和 iloc 属性可以访问多个cell,区别是loc可以使用标签和布尔(掩码)数组,不能使用整数位置(整数代表元素的位置),而iloc只能使用整数位置。
loc 和 iloc的格式是:
- [row] 访问单行,包括所有列
- [row, column] 访问有row 和 column 确定的元素
.loc[]
主要基于标签,但也可以与布尔数组一起使用。在格式 .loc[row,col] 中,row和col允许的输入有:
- label:单个标签,表示行标签,索引的数据是一行
- [label]:标签数组,表示行标签数组,索引的数据是多行
- ['a':'f'] 或 ['a':'f']:索引切片
- [True, False, True]:和axis等长的布尔数组
举个例子,分别使用iloc 和loc来访问数组的多个元素:
>>> df.iloc[[0,1],[0,2]]
year pop
one 2000 1.5
two 2001 1.7
>>> df.loc[['one','two'],['year','pop']]
year pop
one 2000 1.5
two 2001 1.7
三,访问整列的数据
直接通过列名来访问DataFrame的数据,选择特定列的所有数据行,有两种格式是:
- df['col'] 单列索引方式
- df.col 属性方式
- df[['col1','col2']] 列索引数组方式
1,属性方式 和单列索引方式
对于属性方式和单列索引方式,只能用于访问单列,返回的是Series对象:
df['state']
df.state
属性方式是指:列名作为DataFrame对象的属性,通过 . 号引用列名来访问一列的值
单列索引方式是指:列名作为DataFrame对象的索引,通过[] 号索引列来访问一列的值
2,列索引数组方式
对于列索引数组方式,一次访问多列,返回的对象是DataFrame类型
df[['year','state']]
3,对序列进行查询
对于单列索引和属性方式,返回的结果是一个序列,因此,可以通过[idx]来访问序列中的元素,[]中的索引idx是行索引,也就是说,使用 .col[row] 或 [col][row] 来访问单个cell,举个列子:
>>> df.year['one']
2000
>>> df['year']['one']
2000
四,索引数组
索引数组是指DataFrame使用数组作为索引,索引数组可以是行标签、列标签,或者行索引、列索引,也可以是布尔(掩码)索引数组。
1,列标签构成的索引数组
数据框对象可以使用loc和列标签来访问数据,例如,省略row维度,选择state和pop列的所有数据行:
>>> df.loc[:,['state','pop']] state pop one Ohio 1.5 two Ohio 1.7 three Ohio 3.6 four Nevada 2.4 five Nevada 2.9
2,掩码索引数组
掩码索引数组是由True和False构成的数组,在特定的轴(维度)上,维度的长度和掩码索引的长度相同,选择True对应的索引,忽略False对应的索引。
举个例子,省略row维度的索引,由于该数据框由三列,可以把year和state列对应的掩码设置为True,把pop列对应的掩码设置为False。
>>> df.columns Index(['year', 'state', 'pop'], dtype='object') >>> df.loc[:,[True,True,False]] year state one 2000 Ohio two 2001 Ohio three 2002 Ohio four 2001 Nevada five 2002 Nevada
序列具有矢量化操作的特性,当选择某一列时,可以通过逻辑运算得出掩码索引数组:
>>> df['pop']>=2 one False two False three True four True five True Name: pop, dtype: bool >>> df.loc[df['pop']>=2] year state pop three 2002 Ohio 3.6 four 2001 Nevada 2.4 five 2002 Nevada 2.9
五,遍历DataFrame
DataFrame是一个二维结构,既可以逐列遍历数据框,也可以逐行遍历数据框。
1,逐列遍历数据框 df.items
使用items()遍历数据框,返回的是结果是一个二元的元组:(column name, Series) ,由列名和列值列表构成,也就是说,每次迭代返回一列数据:
>>> for col_name,col in df.items(): ... print(col_name,col)
举个例子,按照列来遍历数据框:
df = pd.DataFrame({'species': ['bear', 'bear', 'marsupial'], 'population': [1864, 22000, 80000]}, index=['panda', 'polar', 'koala']) df species population panda bear 1864 polar bear 22000 koala marsupial 80000 for label, content in df.items(): print(f'label: {label}') print(f'content: {content}', sep='\n') label: species content: panda bear polar bear koala marsupial Name: species, dtype: object label: population content: panda 1864 polar 22000 koala 80000 Name: population, dtype: int64
2,逐行遍历数据框 df.iterrows
使用iterrows() 遍历数据框,iterrows()返回值为一个二元的元组(index,row) ,由行索引和每行的值列表构成,也就是说,每次迭代返回一行的数据:
for index,row in df.iterrows():
print(index,row)
使用itertuples()遍历数据框,返回的是命名元组:
>> df = pd.DataFrame({'num_legs': [4, 2], 'num_wings': [0, 2]}, index=['dog', 'hawk']) >> df num_legs num_wings dog 4 0 hawk 2 2 >> for row in df.itertuples(): print(row) Pandas(Index='dog', num_legs=4, num_wings=0) Pandas(Index='hawk', num_legs=2, num_wings=2)
参考文档: