Pandas 下标存取操作

Pandas对数据的获取封装了大量的方法,主要包括.loc[], .iloc[], .at[], iat[], .ix[]以及[]操作符, 下面例子主要是展示了如何使用它们。

df = pd.DataFrame(data=[['Alice', 'girl', 18, 171],
                       ['Bob', 'boy', 19, 172],
                       ['Tom', 'boy', 17, 173],
                       ['Lucy', 'girl', 18, 172]],
                    columns=['Name', 'Sex', 'Age', 'Class'],
                    index=['A', 'B', 'C', 'D'])

下面的操作都基于以上数据集。
一、 []操作符
1、单个索引标签:获取标签所在的列,返回一个Series对象。

print df['Name'] # 或者 df.Name

output:
A Alice
B Bob
C Tom
D Lucy
Name: Name, dtype: object

2、多个索引标签:获取多列,返回一个DataFrame对象。

print df[['Name', 'Age']]

output:
Name Age
A Alice 18
B Bob 19
C Tom 17
D Lucy 18

3、整数切片:以整数下标获取切片对应的行。

print df[1:3]

output:
Name Sex Age Class
B Bob boy 19 172
C Tom boy 17 173

4、标签切片:获取多行。

print df['B':'C'] # 注意:'C'行也会被截取进来

output:
Name Sex Age Class
B Bob boy 19 172
C Tom boy 17 173

5、布尔数组:获取数组中True对应的行。

print df['Age'] >= 18 # 这是一个布尔序列

output:
A True
B True
C False
D True
Name: Age, dtype: bool

print df[df['Age'] >= 18]

output:
Name Sex Age Class
A Alice girl 18 171
B Bob boy 19 172
D Lucy girl 18 172

6、布尔DataFrame:将DataFrame对象中False对应的元素设置为NaN。

print df == 18 # 这是一个布尔DataFrame对象 
(注意:df不能直接进行非数值比较,如:df == 'Alice' 错误)

output:
Name Sex Age Class
A False False True False
B False False False False
C False False False False
D False False True False

print df[df == 18]

output:
Name Sex Age Class
A NaN NaN 18.0 NaN
B NaN NaN NaN NaN
C NaN NaN NaN NaN
D NaN NaN 18.0 NaN

二、.loc[]、.iloc[]和.ix[]存取器
1、.loc[] (.loc[行索引/切片, 列索引/切片])

print df.loc['A'] # 获取'A'行
print df.loc[['A', 'B']] # 获取'A'、'B'两行
print df.loc['A', 'Name'] # 行列定位(获取一个元素)

print df.loc['A':'C', 'Name':'Age'] # 行列切片

output:
Name Sex Age
A Alice girl 18
B Bob boy 19
C Tom boy 17

print df.loc[df['Age'] > 18] # 行过滤

output:
Name Sex Age
B Bob boy 19

print df.loc[df['Age'] >= 18, ['Name', 'Sex', 'Age']] # 行列过滤

output:
Name Sex Age
A Alice girl 18
B Bob boy 19
D Lucy girl 18

print df.loc[:, df.columns.str.contains('e')] # 根据列名过滤

output:
Name Sex Age
A Alice girl 18
B Bob boy 19
C Tom boy 17
D Lucy girl 18

2、.iloc[] (与.loc[]类似,只是其使用的是整数下标)

print df.iloc[:, [0, 3]] # 行列过滤:获取所有行, 第一、第四列

output:
Name Class
A Alice 171
B Bob 172
C Tom 173
D Lucy 172

3、.ix[] 是混用了标签和整数下标,也就是结合了.col[]与.icol[]的功能

print df.ix[:3, ['Name', 'Sex', 'Age']] # 行列过滤

output:
Name Sex Age
A Alice girl 18
B Bob boy 19
C Tom boy 17

三、获取单个值
1、.at[]与.iat[] 分别是使用标签和整数下标来获取单个值

print df.at['A', 'Name']
print df.iat[0, 0] # 操作结果与上面是一样的 

output:
Alice

2、.get_value()与.at[]类似

print df.get_value('B', 'Name')

output:
Bob

3、.lookup() 获取指定元素数组

print df.lookup(['A','B'], ['Name', 'Age'])

output:
['Alice' 19]

四、利用query()方法筛选数据

print df.query('Age >= 19 and Class == 172') 
# 其实上面操作等价于: df[(df.Age >= 19) & (df.Class == 172)]

output:
Name Sex Age Class
B Bob boy 19 172

query()的参数是一个运算表达式字符串,使用notandor关键字进行布尔运算,表达式中的变量名表示与其对应的列,表达式中还支持变量的使用:
age = 19
print df.query('Age >= @age and Class == 172')


猜你喜欢

转载自blog.csdn.net/ialexanderi/article/details/80482287