Python,pandas中DataFrame的选取总结

系统 1530 0

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)

            
          

输出结果为:

            
                  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        no

            
          

1. 直接选取
选取行:直接在定义的df后加[ ],然后输入数字索引或者定义的行标签,可以使用切片。
选取列:直接在定义的df后加[ ],然后输入定义的列标签,不能使用切片。
选取行使用切片时应注意,数字索引为左闭右开,自己定义的标签索引为左闭右闭。

            
              #选取行
df[0 : 2]#左闭右开
df[:1]
df['a' : 'c']#左闭右闭

#选取列
df['name']
df[['name', 'age']]#多个列的时候要用两个[]
df[lambda df: df.columns[0]]#选取第一列

            
          

注意:直接选取列时不能使用切片

            
              df[['name': 'gender']]#选取列时使用切片会报错

    df[['name': 'gender']]
              ^
SyntaxError: invalid syntax

            
          

用直接选取来进行条件选取

            
              
#条件选取行
df[[i > 30 for i in df['age']]]
df[df['age'] > 30]


            
          

上面两个输出如下

            
                  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        no

            
          

当条件有多个时,可以用&,|, !=等连接多个条件,但是符号前后要加()

            
              #筛选出年龄大于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        no

            
          

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.0

            
          

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]

            
          

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.0

            
          

3. at[ ]、iat[ ]选取单元格
#.at[],只能用标签索引

            
              df.at['a', 'name']
Out[21]: 'Joe'

            
          

#.iat[],只能用整数索引

            
              df.iat[1, 0]
Out[22]: 'Mike'

            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论