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