Python,pandas中DataFrame的选取总结
pandas中选取方式有很多种,最常用的是一下几种:直接选取(单维度选取)、iloc();loc();ix()函数选取(区域选区),at();iat()函数选取(单元格选取)。
通过以上几种方式可以实现:选取某些行、某些列、某区域(同时选择某些行和某些列)、某个单元格,还可以进行条件选区。具体实现方法如下。
首先创建一个DataFrame.
import pandas as pdimport numpy as npdata = {'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 isMarrieda Joe 25.0 1 yesb Mike 32.0 0 yesc Jack 18.0 1 nod Rose NaN 1 yese David 15.0 0 nof Marry 20.0 1 nog Wansi 41.0 0 noh Sidy NaN 0 yesi Jason 37.0 1 noj 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 isMarriedb Mike 32.0 0 yesg Wansi 41.0 0 noi Jason 37.0 1 noj Even 32.0 0 no12345
当条件有多个时,可以用&,|, !=等连接多个条件,但是符号前后要加()
#筛选出年龄大于30且未婚的人df[(df['age'] > 30) & (df['isMarried'] == 'no')]#多个条件,每个条件要用()括起来输出结果为: name age gender isMarriedg Wansi 41.0 0 noi Jason 37.0 1 noj 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 ageb Mike 32.0f 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 agea Joe yes 25.0c Jack no 18.0>>>df.ix[2: 5]#选取某些行,左闭右闭Out[19]: name age gender isMarriedc Jack 18.0 1 nod Rose NaN 1 yese David 15.0 0 no>>>df.ix[:, 'name': 'gender']#选取某些列,左闭右闭Out[20]: name age gendera Joe 25.0 1b Mike 32.0 0c Jack 18.0 1d Rose NaN 1e David 15.0 0f Marry 20.0 1g Wansi 41.0 0h Sidy NaN 0i Jason 37.0 1j Even 32.0 0>>>df.ix[2: 5, 'name': 'gender']#选取一块区域,左闭右闭Out[18]: name age genderc Jack 18.0 1d Rose NaN 1e David 15.0 0>>>df.ix[df['isMarried'] == 'no', ['name', 'age']]#选择符合未婚条件的某区域Out[17]: name agec Jack 18.0e David 15.0f Marry 20.0g Wansi 41.0i Jason 37.0j Even 32.01234567891011121314151617181920212223242526272829303132333435363738394041424344454647
3. at[ ]、iat[ ]选取单元格
#.at[],只能用标签索引
df.at['a', 'name']Out[21]: 'Joe'12
#.iat[],只能用整数索引
df.iat[1, 0]Out[22]: 'Mike'
赞 (0)