因 457079928 python草堂群,网友 @星河·璀动 问到pandas选择数据列的问题,故把自己的学习总结的笔记整理出来。
完整的ipynb
文件,和文中示例数据请移步python草堂群下载。
注意:这些方法返回的都是视图。
- 如果你确信原始数据的一些列是无用的,可以在删除这些列后,创建 DataFrame 的一个
.copy(deep=True)
,然后删除原 DataFrame, 以节省内存; - 如果列不是很多,在导入数据时就排除这些列。
选择列的两种思路
- 需要的列较少,直接选择需要的列;
- 不需要的列较少,删除或排除不要的列。
import numpy as np
import pandas as pd
import pprint as pp
baseball_df = pd.read_csv('baseball.csv',index_col='No.')
pp.pprint(baseball_df)
id year stint team lg g ab r h X2b ... rbi \
No. ...
4 ansonca01 1871 1 RC1 NaN 25 120 29 39 11 ... 16.0
44 forceda01 1871 1 WS3 NaN 32 162 45 45 9 ... 29.0
68 mathebo01 1871 1 FW1 NaN 19 89 15 24 3 ... 10.0
99 startjo01 1871 1 NY2 NaN 33 161 35 58 5 ... 34.0
102 suttoez01 1871 1 CL1 NaN 29 128 35 45 3 ... 23.0
... ... ... ... ... ... ... ... .. ... ... ... ...
89525 benitar01 2007 2 FLO NL 34 0 0 0 0 ... 0.0
89526 benitar01 2007 1 SFN NL 19 0 0 0 0 ... 0.0
89530 ausmubr01 2007 1 HOU NL 117 349 38 82 16 ... 25.0
89533 aloumo01 2007 1 NYN NL 87 328 51 112 19 ... 49.0
89534 alomasa02 2007 1 NYN NL 8 22 1 3 1 ... 0.0
sb cs bb so ibb hbp sh sf gidp
No.
4 6.0 2.0 2 1.0 NaN NaN NaN NaN NaN
44 8.0 0.0 4 0.0 NaN NaN NaN NaN NaN
68 2.0 1.0 2 0.0 NaN NaN NaN NaN NaN
99 4.0 2.0 3 0.0 NaN NaN NaN NaN NaN
102 3.0 1.0 1 0.0 NaN NaN NaN NaN NaN
... ... ... .. ... ... ... ... ... ...
89525 0.0 0.0 0 0.0 0.0 0.0 0.0 0.0 0.0
89526 0.0 0.0 0 0.0 0.0 0.0 0.0 0.0 0.0
89530 6.0 1.0 37 74.0 3.0 6.0 4.0 1.0 11.0
89533 3.0 0.0 27 30.0 5.0 2.0 0.0 3.0 13.0
89534 0.0 0.0 0 3.0 0.0 0.0 0.0 0.0 0.0
[21699 rows x 22 columns]
方法一:直接指定需要的列
pp.pprint(baseball_df.query('g>50')[['year','g','ab','r','h']])
year g ab r h
No.
249 1872 55 282 62 76
268 1872 51 248 66 66
276 1873 52 254 53 101
293 1873 55 245 56 62
344 1873 52 223 40 43
... ... ... ... .. ...
89499 2007 69 189 23 48
89521 2007 126 340 75 94
89523 2007 141 517 68 130
89530 2007 117 349 38 82
89533 2007 87 328 51 112
[11704 rows x 5 columns]
方法二:获取需要的列名列表
使用列表推导排除不需要的列
cols = [i for i in baseball_df.columns if i not in ['id', 'ibb','gidp','X2b','X3b','lg']]
baseball_df[cols]
year | stint | team | g | ab | r | h | hr | rbi | sb | cs | bb | so | hbp | sh | sf | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
No. | ||||||||||||||||
4 | 1871 | 1 | RC1 | 25 | 120 | 29 | 39 | 0 | 16.0 | 6.0 | 2.0 | 2 | 1.0 | NaN | NaN | NaN |
44 | 1871 | 1 | WS3 | 32 | 162 | 45 | 45 | 0 | 29.0 | 8.0 | 0.0 | 4 | 0.0 | NaN | NaN | NaN |
68 | 1871 | 1 | FW1 | 19 | 89 | 15 | 24 | 0 | 10.0 | 2.0 | 1.0 | 2 | 0.0 | NaN | NaN | NaN |
99 | 1871 | 1 | NY2 | 33 | 161 | 35 | 58 | 1 | 34.0 | 4.0 | 2.0 | 3 | 0.0 | NaN | NaN | NaN |
102 | 1871 | 1 | CL1 | 29 | 128 | 35 | 45 | 3 | 23.0 | 3.0 | 1.0 | 1 | 0.0 | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
89525 | 2007 | 2 | FLO | 34 | 0 | 0 | 0 | 0 | 0.0 | 0.0 | 0.0 | 0 | 0.0 | 0.0 | 0.0 | 0.0 |
89526 | 2007 | 1 | SFN | 19 | 0 | 0 | 0 | 0 | 0.0 | 0.0 | 0.0 | 0 | 0.0 | 0.0 | 0.0 | 0.0 |
89530 | 2007 | 1 | HOU | 117 | 349 | 38 | 82 | 3 | 25.0 | 6.0 | 1.0 | 37 | 74.0 | 6.0 | 4.0 | 1.0 |
89533 | 2007 | 1 | NYN | 87 | 328 | 51 | 112 | 13 | 49.0 | 3.0 | 0.0 | 27 | 30.0 | 2.0 | 0.0 | 3.0 |
89534 | 2007 | 1 | NYN | 8 | 22 | 1 | 3 | 0 | 0.0 | 0.0 | 0.0 | 0 | 3.0 | 0.0 | 0.0 | 0.0 |
21699 rows × 16 columns
baseball_df.query('g>100.0')[cols]
year | stint | team | g | ab | r | h | hr | rbi | sb | cs | bb | so | hbp | sh | sf | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
No. | ||||||||||||||||
1988 | 1884 | 1 | LS2 | 103 | 447 | 101 | 150 | 4 | 47.0 | 0.0 | NaN | 13 | NaN | 2.0 | NaN | NaN |
1989 | 1884 | 1 | CL5 | 107 | 451 | 93 | 123 | 5 | 32.0 | 0.0 | NaN | 24 | NaN | 4.0 | NaN | NaN |
2053 | 1884 | 1 | LS2 | 106 | 404 | 39 | 89 | 0 | 40.0 | 0.0 | NaN | 13 | NaN | 5.0 | NaN | NaN |
2082 | 1884 | 1 | CN2 | 112 | 472 | 117 | 148 | 7 | 71.0 | 0.0 | NaN | 37 | NaN | 10.0 | NaN | NaN |
2102 | 1884 | 1 | SL4 | 110 | 474 | 115 | 130 | 1 | 0.0 | 0.0 | NaN | 18 | NaN | 6.0 | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
89481 | 2007 | 1 | SLN | 117 | 365 | 39 | 92 | 12 | 53.0 | 0.0 | 2.0 | 41 | 75.0 | 0.0 | 2.0 | 3.0 |
89489 | 2007 | 1 | NYN | 139 | 538 | 71 | 139 | 24 | 87.0 | 4.0 | 0.0 | 52 | 118.0 | 11.0 | 0.0 | 6.0 |
89521 | 2007 | 1 | SFN | 126 | 340 | 75 | 94 | 28 | 66.0 | 5.0 | 0.0 | 132 | 54.0 | 3.0 | 0.0 | 2.0 |
89523 | 2007 | 1 | HOU | 141 | 517 | 68 | 130 | 10 | 50.0 | 4.0 | 3.0 | 23 | 112.0 | 3.0 | 7.0 | 5.0 |
89530 | 2007 | 1 | HOU | 117 | 349 | 38 | 82 | 3 | 25.0 | 6.0 | 1.0 | 37 | 74.0 | 6.0 | 4.0 | 1.0 |
7554 rows × 16 columns
#也可以这样:
baseball_df[cols].query('g>100')
year | stint | team | lg | g | ab | r | h | hr | rbi | sb | cs | bb | so | hbp | sh | sf | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
No. | |||||||||||||||||
1988 | 1884 | 1 | LS2 | AA | 103 | 447 | 101 | 150 | 4 | 47.0 | 0.0 | NaN | 13 | NaN | 2.0 | NaN | NaN |
1989 | 1884 | 1 | CL5 | AA | 107 | 451 | 93 | 123 | 5 | 32.0 | 0.0 | NaN | 24 | NaN | 4.0 | NaN | NaN |
2053 | 1884 | 1 | LS2 | AA | 106 | 404 | 39 | 89 | 0 | 40.0 | 0.0 | NaN | 13 | NaN | 5.0 | NaN | NaN |
2082 | 1884 | 1 | CN2 | AA | 112 | 472 | 117 | 148 | 7 | 71.0 | 0.0 | NaN | 37 | NaN | 10.0 | NaN | NaN |
2102 | 1884 | 1 | SL4 | AA | 110 | 474 | 115 | 130 | 1 | 0.0 | 0.0 | NaN | 18 | NaN | 6.0 | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
89481 | 2007 | 1 | SLN | NL | 117 | 365 | 39 | 92 | 12 | 53.0 | 0.0 | 2.0 | 41 | 75.0 | 0.0 | 2.0 | 3.0 |
89489 | 2007 | 1 | NYN | NL | 139 | 538 | 71 | 139 | 24 | 87.0 | 4.0 | 0.0 | 52 | 118.0 | 11.0 | 0.0 | 6.0 |
89521 | 2007 | 1 | SFN | NL | 126 | 340 | 75 | 94 | 28 | 66.0 | 5.0 | 0.0 | 132 | 54.0 | 3.0 | 0.0 | 2.0 |
89523 | 2007 | 1 | HOU | NL | 141 | 517 | 68 | 130 | 10 | 50.0 | 4.0 | 3.0 | 23 | 112.0 | 3.0 | 7.0 | 5.0 |
89530 | 2007 | 1 | HOU | NL | 117 | 349 | 38 | 82 | 3 | 25.0 | 6.0 | 1.0 | 37 | 74.0 | 6.0 | 4.0 | 1.0 |
7554 rows × 17 columns
使用difference方法返回索引的差集
baseball_df.columns
Index(['id', 'year', 'stint', 'team', 'lg', 'g', 'ab', 'r', 'h', 'X2b', 'X3b',
'hr', 'rbi', 'sb', 'cs', 'bb', 'so', 'ibb', 'hbp', 'sh', 'sf', 'gidp'],
dtype='object')
cols = baseball_df.columns.difference(['ibb','gidp','X2b','X3b','id'],sort=False)
#sort=False,否则返回的df的columns会重新排序
cols
Index(['year', 'stint', 'team', 'lg', 'g', 'ab', 'r', 'h', 'hr', 'rbi', 'sb',
'cs', 'bb', 'so', 'hbp', 'sh', 'sf'],
dtype='object')
baseball_df.query('g>100.0')[cols]
year | stint | team | lg | g | ab | r | h | hr | rbi | sb | cs | bb | so | hbp | sh | sf | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
No. | |||||||||||||||||
1988 | 1884 | 1 | LS2 | AA | 103 | 447 | 101 | 150 | 4 | 47.0 | 0.0 | NaN | 13 | NaN | 2.0 | NaN | NaN |
1989 | 1884 | 1 | CL5 | AA | 107 | 451 | 93 | 123 | 5 | 32.0 | 0.0 | NaN | 24 | NaN | 4.0 | NaN | NaN |
2053 | 1884 | 1 | LS2 | AA | 106 | 404 | 39 | 89 | 0 | 40.0 | 0.0 | NaN | 13 | NaN | 5.0 | NaN | NaN |
2082 | 1884 | 1 | CN2 | AA | 112 | 472 | 117 | 148 | 7 | 71.0 | 0.0 | NaN | 37 | NaN | 10.0 | NaN | NaN |
2102 | 1884 | 1 | SL4 | AA | 110 | 474 | 115 | 130 | 1 | 0.0 | 0.0 | NaN | 18 | NaN | 6.0 | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
89481 | 2007 | 1 | SLN | NL | 117 | 365 | 39 | 92 | 12 | 53.0 | 0.0 | 2.0 | 41 | 75.0 | 0.0 | 2.0 | 3.0 |
89489 | 2007 | 1 | NYN | NL | 139 | 538 | 71 | 139 | 24 | 87.0 | 4.0 | 0.0 | 52 | 118.0 | 11.0 | 0.0 | 6.0 |
89521 | 2007 | 1 | SFN | NL | 126 | 340 | 75 | 94 | 28 | 66.0 | 5.0 | 0.0 | 132 | 54.0 | 3.0 | 0.0 | 2.0 |
89523 | 2007 | 1 | HOU | NL | 141 | 517 | 68 | 130 | 10 | 50.0 | 4.0 | 3.0 | 23 | 112.0 | 3.0 | 7.0 | 5.0 |
89530 | 2007 | 1 | HOU | NL | 117 | 349 | 38 | 82 | 3 | 25.0 | 6.0 | 1.0 | 37 | 74.0 | 6.0 | 4.0 | 1.0 |
7554 rows × 17 columns
pp.pprint(baseball_df)
id year stint team lg g ab r h X2b ... rbi \
No. ...
4 ansonca01 1871 1 RC1 NaN 25 120 29 39 11 ... 16.0
44 forceda01 1871 1 WS3 NaN 32 162 45 45 9 ... 29.0
68 mathebo01 1871 1 FW1 NaN 19 89 15 24 3 ... 10.0
99 startjo01 1871 1 NY2 NaN 33 161 35 58 5 ... 34.0
102 suttoez01 1871 1 CL1 NaN 29 128 35 45 3 ... 23.0
... ... ... ... ... ... ... ... .. ... ... ... ...
89525 benitar01 2007 2 FLO NL 34 0 0 0 0 ... 0.0
89526 benitar01 2007 1 SFN NL 19 0 0 0 0 ... 0.0
89530 ausmubr01 2007 1 HOU NL 117 349 38 82 16 ... 25.0
89533 aloumo01 2007 1 NYN NL 87 328 51 112 19 ... 49.0
89534 alomasa02 2007 1 NYN NL 8 22 1 3 1 ... 0.0
sb cs bb so ibb hbp sh sf gidp
No.
4 6.0 2.0 2 1.0 NaN NaN NaN NaN NaN
44 8.0 0.0 4 0.0 NaN NaN NaN NaN NaN
68 2.0 1.0 2 0.0 NaN NaN NaN NaN NaN
99 4.0 2.0 3 0.0 NaN NaN NaN NaN NaN
102 3.0 1.0 1 0.0 NaN NaN NaN NaN NaN
... ... ... .. ... ... ... ... ... ...
89525 0.0 0.0 0 0.0 0.0 0.0 0.0 0.0 0.0
89526 0.0 0.0 0 0.0 0.0 0.0 0.0 0.0 0.0
89530 6.0 1.0 37 74.0 3.0 6.0 4.0 1.0 11.0
89533 3.0 0.0 27 30.0 5.0 2.0 0.0 3.0 13.0
89534 0.0 0.0 0 3.0 0.0 0.0 0.0 0.0 0.0
[21699 rows x 22 columns]
删除不需要的列
pp.pprint(baseball_df.drop(['ibb','gidp','X2b','X3b','id','lg'],axis=1))
year stint team g ab r h hr rbi sb cs bb so hbp \
No.
4 1871 1 RC1 25 120 29 39 0 16.0 6.0 2.0 2 1.0 NaN
44 1871 1 WS3 32 162 45 45 0 29.0 8.0 0.0 4 0.0 NaN
68 1871 1 FW1 19 89 15 24 0 10.0 2.0 1.0 2 0.0 NaN
99 1871 1 NY2 33 161 35 58 1 34.0 4.0 2.0 3 0.0 NaN
102 1871 1 CL1 29 128 35 45 3 23.0 3.0 1.0 1 0.0 NaN
... ... ... ... ... ... .. ... .. ... ... ... .. ... ...
89525 2007 2 FLO 34 0 0 0 0 0.0 0.0 0.0 0 0.0 0.0
89526 2007 1 SFN 19 0 0 0 0 0.0 0.0 0.0 0 0.0 0.0
89530 2007 1 HOU 117 349 38 82 3 25.0 6.0 1.0 37 74.0 6.0
89533 2007 1 NYN 87 328 51 112 13 49.0 3.0 0.0 27 30.0 2.0
89534 2007 1 NYN 8 22 1 3 0 0.0 0.0 0.0 0 3.0 0.0
sh sf
No.
4 NaN NaN
44 NaN NaN
68 NaN NaN
99 NaN NaN
102 NaN NaN
... ... ...
89525 0.0 0.0
89526 0.0 0.0
89530 4.0 1.0
89533 0.0 3.0
89534 0.0 0.0
[21699 rows x 16 columns]
使用 filter 方法
baseball_df.filter(items=['year','g'])
year | g | |
---|---|---|
No. | ||
4 | 1871 | 25 |
44 | 1871 | 32 |
68 | 1871 | 19 |
99 | 1871 | 33 |
102 | 1871 | 29 |
... | ... | ... |
89525 | 2007 | 34 |
89526 | 2007 | 19 |
89530 | 2007 | 117 |
89533 | 2007 | 87 |
89534 | 2007 | 8 |
21699 rows × 2 columns
baseball_df.filter(regex='b$') #选择列名中包含b 的列
ab | X2b | X3b | sb | bb | ibb | |
---|---|---|---|---|---|---|
No. | ||||||
4 | 120 | 11 | 3 | 6.0 | 2 | NaN |
44 | 162 | 9 | 4 | 8.0 | 4 | NaN |
68 | 89 | 3 | 1 | 2.0 | 2 | NaN |
99 | 161 | 5 | 1 | 4.0 | 3 | NaN |
102 | 128 | 3 | 7 | 3.0 | 1 | NaN |
... | ... | ... | ... | ... | ... | ... |
89525 | 0 | 0 | 0 | 0.0 | 0 | 0.0 |
89526 | 0 | 0 | 0 | 0.0 | 0 | 0.0 |
89530 | 349 | 16 | 3 | 6.0 | 37 | 3.0 |
89533 | 328 | 19 | 1 | 3.0 | 27 | 5.0 |
89534 | 22 | 1 | 0 | 0.0 | 0 | 0.0 |
21699 rows × 6 columns
baseball_df.filter(like='ea')
year | team | |
---|---|---|
No. | ||
4 | 1871 | RC1 |
44 | 1871 | WS3 |
68 | 1871 | FW1 |
99 | 1871 | NY2 |
102 | 1871 | CL1 |
... | ... | ... |
89525 | 2007 | FLO |
89526 | 2007 | SFN |
89530 | 2007 | HOU |
89533 | 2007 | NYN |
89534 | 2007 | NYN |
21699 rows × 2 columns