pandas 中如何提取 dataframe 的某些列

在处理表格型数据时,一行数据是一个 sample,列就是待提取的特征。怎么选取其中的一些列呢?本文分享一些方法。

使用如下的数据作为例子:

import pandas as pd
df = 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])


Name course1 course2 course3 fruit sport
1 Anna 85 90 82 apple basketball
2 Betty 83 85 86 banana volleyball
3 Richard 90 83 81 apple football
4 Philip 84 88 91 orange basketball
5 Paul 85 84 85 peach baseball


方法一:df[columns]

先看最简单的情况。输入列名,选择一列。例如:

df['course2']
输出结果为:
1    90
2    85
3    83
4    88
5    84
Name: course2, dtype: int64

df[column list]:选择列。例如:

df[['course2','fruit']]

输出结果为:

course2 fruit
1 90 apple
2 85 banana
3 83 apple
4 88 orange
5 84 peach


或者以 column list (list 变量)的形式导入到 df[ ] 中,例如:

select_cols=['course2','fruit']
df[select_cols]

输出结果为:

course2 fruit
1 90 apple
2 85 banana
3 83 apple
4 88 orange
5 84 peach


可以用 column list=df.columns[start:end] 的方式选择连续列,start 和 end 均为数字,不包括 end 列。例如:

select_cols=df.columns[1:4]
df[select_cols]

输出结果为:

course1 course2 course3
1 85 90 82
2 83 85 86
3 90 83 81
4 84 88 91
5 85 84 85


你可能注意到,其中有 3 列的名字相近:'course1','course2','course3'。怎么提取这三列呢?这里分享在 Kaggle 上看到 一位大神使用的 list comprehension方法

select_cols=[c for c in df.columns if 'course' in c]
df[select_cols]

输出结果为:

course1 course2 course3
1 85 90 82
2 83 85 86
3 90 83 81
4 84 88 91
5 85 84 85


但是,如果你想输入 df['course1':'course3'] 来索引连续列,就会报错。而输入数字索引 df[1:3] 时,结果不再是列索引,而是行索引,如下所示:

df[1:3]

输出结果为:

Name course1 course2 course3 fruit sport
2 Betty 83 85 86 banana volleyball
3 Richard 90 83 81 apple football


以下两种方法 df.loc[]和df.iloc[]就可以解决这个问题,可以明确行或列索引。还可以同时取多行和多列。


方法二:df.loc[]:用 label (行名或列名)做索引。

输入 column_list 选择多列 [:, column_list] ,括号中第一个 : 表示选择全部行。例如:

df.loc[:,['course2','fruit']]

输出结果为:

course2 fruit
1 90 apple
2 85 banana
3 83 apple
4 88 orange
5 84 peach


选择连续多列 [:,start_col: end_col] ,注意:包括 end_col。例如:

df.loc[:,'course2':'fruit']

输出结果为:

course2 course3 fruit
1 90 82 apple
2 85 86 banana
3 83 81 apple
4 88 91 orange
5 84 85 peach


选择多行和多列,例如:

df.loc[1:3,'course2':'fruit']