在处理表格型数据时,一行数据是一个 sample,列就是待提取的特征。怎么选取其中的一些列呢?本文分享一些方法。
使用如下的数据作为例子:
import pandas as pd
1
data = pd.DataFrame({'Name':['Anna', 'Betty', 'Richard', 'Philip','Paul'],
'course1':[85,83,90,84,85],
'course2':[90,85,83,88,84],
'course3':[82,86,81,91,85],
'fruit':['apple','banana','apple','orange','peach'],
'sport':['basketball', 'volleyball', 'football', 'basketball','baseball']},
index=[1,2,3,4,5])
df = pd.DataFrame(data)
1
2
3
4
5
6
7
8
9
df
1
Namecourse1course2course3fruitsport
1Anna859082applebasketball
2Betty838586bananavolleyball
3Richard908381applefootball
4Philip848891orangebasketball
5Paul858485peachbaseball
方法一:df[columns]
先看最简单的情况。输入列名,选择一列。例如:
df['course2']
1
1 90
2 85
3 83
4 88
5 84
Name: course2, dtype: int64
1
2
3
4
5
6
df[column list]:选择列。例如:
df[['course2','fruit']]
1
course2fruit
190apple
285banana
383apple
488orange
584peach
或者以 column list (list 变量)的形式导入到 df[ ] 中,例如:
select_cols=['course2','fruit']
df[select_cols]
1
2
course2fruit
190apple
285banana
383apple
488orange
584peach
可以用 column list=df.columns[start:end] 的方式选择连续列,start 和 end 均为数字,不包括 end 列。例如:
select_cols=df.columns[1:4]
df[select_cols]
1
2
course1course2course3
1859082
2838586
3908381
4848891
5858485
你可能注意到,其中有 3 列的名字相近:‘course1’,‘course2’,‘course3’。怎么提取这三列呢?这里分享在Kaggle 上看到 一位大神使用的 list comprehension方法。
select_cols=[c for c in df.columns if 'course' in c]
df[select_cols]
1
2
course1course2course3
1859082
2838586
3908381
4848891
5858485
但是,如果你想输入df['course1':'course3'] 来索引连续列,就会报错。而输入数字索引df[1:3]时,结果不再是列索引,而是行索引,如下所示:
df[1:3]
1
Namecourse1course2course3fruitsport
2Betty838586bananavolleyball
3Richard908381applefootball
以下两种方法 df.loc[]和df.iloc[]就可以解决这个问题,可以明确行或列索引。还可以同时取多行和多列。
方法二:df.loc[]:用 label (行名或列名)做索引。
输入 column_list 选择多列 [:, column_list],括号中第一个: 表示选择全部行。例如:
df.loc[:,['course2','fruit']]
1
course2fruit
190apple
285banana
383apple
488orange
584peach
选择连续多列 [:,start_col: end_col],注意:包括 end_col。例如:
df.loc[:,'course2':'fruit']
1
course2course3fruit
19082apple
28586banana
38381apple
48891orange
58485peach
选择多行和多列,例如:
df.loc[1:3,'course2':'fruit']
1
course2course3fruit
19082apple
28586banana
38381apple
与 df[ ]类似,df.loc[ ]括号内也可以输入判断语句,结果是对行做筛选。例如:
df.loc[df['course1']>84]
#注:输入df[df['course1']>84],输出结果相同
1
2
Namecourse1course2course3fruitsport
1Anna859082applebasketball
3Richard908381applefootball
5Paul858485peachbaseball
方法三:df.iloc[]: i 表示 integer,用 integer location(行或列的整数位置,从0开始)做索引。
df.iloc与df.loc用法类似,只是索引项不同。
df.iloc[:,[2,4]]
1
course2fruit
190apple
285banana
383apple
488orange
584peach
选择连续多列:df.iloc[:, start_ix:end_ix],注意:不包括 end_ix。例如:
df.iloc[:,2:5]
1
course2course3fruit
19082apple
28586banana
38381apple
48891orange
58485peach
选择多行与多列,例如:
df.iloc[1:3,[2,4]]
1
course2fruit
285banana
383apple
与 df.loc[] 不同,df.iloc[] 括号内不可以输入判断语句。
读取数据为dataFrame格式后,需要对数据进行访问操作。
首先生成数据,并进行打印,可以看到数据格式如下:
import pandas as pd
data_list = [[56,2,32],[51,5,45],[31,14,25],[13,24,75]]
df = pd.DataFrame(data_list,columns=['A','B','C'])
print(df)
![](https://i-blog.csdnimg.cn/blog_migrate/923064a706e2aa0c9830b291a178b0ae.jpeg)
为方便直观的看到数据访问差别,在此将index数据修改为row1,row2,row3,row4
df.index = ['row1','row2','row3','row4']
print(df)
修改后的index为:
![](https://i-blog.csdnimg.cn/blog_migrate/a38866b230bf736f1eea21967d8e9020.jpeg)
. loc是按照行名列名进行访问,iloc按照位置进行访问。
![](https://i-blog.csdnimg.cn/blog_migrate/b8737466d5572d4caa951cd743751327.jpeg)
就是说第0行第0列,与row1,A访问的位置是同一个位置,数据是同一个数据。
res1 = df.loc['row1','A']
print(res1)
res2 = df.iloc[0,0]
print(res2)
可以从调试中看到:
![](https://i-blog.csdnimg.cn/blog_migrate/8bac588dbb8820b7ca0e715ec1c361d5.jpeg)
访问多行多列
#访问多行多列:
res3 = df.loc['row1',['A','B']]
print(res3)
res4 = df.iloc[0,0:2]
print(res4)
![](https://i-blog.csdnimg.cn/blog_migrate/682d6c0e294ad8dc7b6fdc8fb025c23d.jpeg)
注意:在iloc中,0:2,从第0行开始,到第二行结束,不包含第二行
访问指定列的所有数据
#访问多行多列:
res5 = df.loc[:,['A','B']]
print(res5)
res6 = df.iloc[:,0:2]
print(res6)
参考:
1.如何选取dataframe的多列-教程:https://www.geeksforgeeks.org/how-to-select-multiple-columns-in-a-pandas-dataframe/
2.用 list comprehension 选择多列:https://www.kaggle.com/code/robikscube/ieee-fraud-detection-first-look-and-eda/notebook
3.df.loc 与 df.iloc 的比较:https://stackoverflow.com/questions/31593201/how-are-iloc-and-loc-different
————————————————
版权声明:本文为CSDN博主「宁萌Julie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/applebear1123/article/details/125128742