pandas中选取方式有很多种,最常用的是一下几种:直接选取(单维度选取)、iloc();loc();ix()函数选取(区域选区),at();iat()函数选取(单元格选取)。
通过以上几种方式可以实现:选取某些行、某些列、某区域(同时选择某些行和某些列)、某个单元格,还可以进行条件选区。具体实现方法如下。
首先创建一个DataFrame.
import pandas as pd import numpy as np data = {'name': ['Joe', 'Mike', 'Jack', 'Rose', 'David', 'Marry', 'Wansi', 'Sidy', 'Jason', 'Even'], 'age': [25, 32, 18, np.nan, 15, 20, 41, np.nan, 37, 32], 'gender': [1, 0, 1, 1, 0, 1, 0, 0, 1, 0], 'isMarried': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']} labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] df = pd.DataFrame(data, index = labels) print(df)12345678910111213141516171819
输出结果为:
name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no d Rose NaN 1 yes e David 15.0 0 no f Marry 20.0 1 no g Wansi 41.0 0 no h Sidy NaN 0 yes i Jason 37.0 1 no j Even 32.0 0 no1234567891011
1. 直接选取
选取行:直接在定义的df后加[ ],然后输入数字索引或者定义的行标签,可以使用切片。
选取列:直接在定义的df后加[ ],然后输入定义的列标签,不能使用切片。
选取行使用切片时应注意,数字索引为左闭右开,自己定义的标签索引为左闭右闭。
#选取行 df[0 : 2]#左闭右开 df[:1] df['a' : 'c']#左闭右闭 #选取列 df['name'] df[['name', 'age']]#多个列的时候要用两个[] df[lambda df: df.columns[0]]#选取第一列123456789
注意:直接选取列时不能使用切片
df[['name': 'gender']]#选取列时使用切片会报错 df[['name': 'gender']] ^ SyntaxError: invalid syntax12345
用直接选取来进行条件选取
#条件选取行 df[[i > 30 for i in df['age']]] df[df['age'] > 30]12345
上面两个输出如下
name age gender isMarried b Mike 32.0 0 yes g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no12345
当条件有多个时,可以用&,|, !=等连接多个条件,但是符号前后要加()
#筛选出年龄大于30且未婚的人 df[(df['age'] > 30) & (df['isMarried'] == 'no')]#多个条件,每个条件要用()括起来 输出结果为: name age gender isMarried g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no12345678
2.loc()、 iloc()、ix()选取区域
这三个的功能相同,都能同时选取行和列,从而选取某个区域或者某(些)行或列。但是其用法不同。区别如下:
loc[],只能用标签选取,前闭后闭
iloc[],只能用整数选取,前闭后开
ix[], 可以使用标签和整数。不管用哪个索引,均为左闭右闭。
另外, 三种方法都可以时用切片,也可以进行条件选取。
loc()的用法举例
#.loc[],只能用标签选取,前闭后闭 #选取行 df.loc['a', :] df.loc['a']#默认所有列 df.loc['a':'c', :]#使用切片时不用加[ ] df.loc[['a', 'c'], ['name', 'age']]#选择某个区域,选择多个单独的行时,要加[ ],相当于创建一个所选行或列的列表 df.loc[df['age'] > 30, : ]#条件选取 #选择列 df.loc[:, 'name'] df.loc[:, 'name' : 'isMarried']#使用切片时不用加[ ] df.loc[:, ['name', 'isMarried']]#选择多个单独的列时,要加[ ] df.loc[df['age'] > 30, ['name', 'age']]#条件选取 #输出行名为‘Mike’或‘Marry’的姓名和年龄 df.loc[(df['name'] == 'Mike') | (df['name'] == 'Marry'), ['name', 'age']] 输出为: name age b Mike 32.0 f Marry 20.01234567891011121314151617181920
iloc()用法举例
#iloc[],只能用整数选取,前闭后开 #选取行 df.iloc[0, :] df.iloc[0]#默认所有列 df.iloc[0 : 3, :]#使用切片时不用加[ ] df.iloc[[0, 3], :]##选择某个区域,选择多个单独的行时,要加[ ] #df.iloc[df.iloc[0] > 30, :]不可行 #选取列 df.iloc[:, 0] df.iloc[:, 0 : 3]#不包含第四列 df.iloc[:, [0, 3]]#第一列和第四列 #同时选取行和列(选取区域) df.iloc[1, [0, 2, 3]] df.iloc[: 3, : 3]123456789101112131415161718
ix()方法
其用法与loc()和iloc()用法相同
不管使用标签还是数字索引,选择区间都为左闭右闭(下面的举例可以看出)。
#ix[], 可以使用标签和整数 >>>df.ix[2, 'name']#第1行,name列(相当于选择了单个单元格) Out[15]: 'Jack' >>>df.ix[['a', 'c'], [0, 3, 1]]#选择了若干个单元格 Out[16]: name isMarried age a Joe yes 25.0 c Jack no 18.0 >>>df.ix[2: 5]#选取某些行,左闭右闭 Out[19]: name age gender isMarried c Jack 18.0 1 no d Rose NaN 1 yes e David 15.0 0 no >>>df.ix[:, 'name': 'gender']#选取某些列,左闭右闭 Out[20]: name age gender a Joe 25.0 1 b Mike 32.0 0 c Jack 18.0 1 d Rose NaN 1 e David 15.0 0 f Marry 20.0 1 g Wansi 41.0 0 h Sidy NaN 0 i Jason 37.0 1 j Even 32.0 0 >>>df.ix[2: 5, 'name': 'gender']#选取一块区域,左闭右闭 Out[18]: name age gender c Jack 18.0 1 d Rose NaN 1 e David 15.0 0 >>>df.ix[df['isMarried'] == 'no', ['name', 'age']]#选择符合未婚条件的某区域 Out[17]: name age c Jack 18.0 e David 15.0 f Marry 20.0 g Wansi 41.0 i Jason 37.0 j Even 32.01234567891011121314151617181920212223242526272829303132333435363738394041424344454647
3. at[ ]、iat[ ]选取单元格
#.at[],只能用标签索引
df.at['a', 'name'] Out[21]: 'Joe'12
#.iat[],只能用整数索引
df.iat[1, 0] Out[22]: 'Mike'