一文看清楚Pandas之DataFrame 的 行 与列的查询和条件匹配,
文末备注了html文件和jupyter notebook的文件
import numpy as np
import pandas as pd
df=pd.DataFrame(
np.arange(12).reshape((3,4)),
index=['one','two','thr'],
columns=list('abcd')
)
执行结果:
a | b | c | d | |
---|---|---|---|---|
one | 0 | 1 | 2 | 3 |
two | 4 | 5 | 6 | 7 |
thr | 8 | 9 | 10 | 11 |
取列 (column)
df['a']#取a列
df[['a','b']]#取a、b列
执行结果:
a | b | |
---|---|---|
one | 0 | 1 |
two | 4 | 5 |
thr | 8 | 9 |
取行 (rows)
loc——通过行标签索引行数据 此处为one two / abcd
iloc——通过行号索引行数据 01234
iloc可以用数字索引,也可以用index和column索引
df.iloc[0]#取第0行,按索引
执行结果:
a 0
b 1
c 2
d 3
Name: one, dtype: int64
df.iloc[0:2]#取第0到2行
执行结果:
a | b | c | d | |
---|---|---|---|---|
one | 0 | 1 | 2 | 3 |
two | 4 | 5 | 6 | 7 |
df.loc['one':'two']#取one、two行,按index
执行结果:
a | b | c | d | |
---|---|---|---|---|
one | 0 | 1 | 2 | 3 |
two | 4 | 5 | 6 | 7 |
df.loc[['one','two'],['a','c']]#取one、two行,abc列
执行结果:
a | c | |
---|---|---|
one | 0 | 2 |
two | 4 | 6 |
匹配:按条件获取
d=[
pd.Series([21,'jel','20210623',21,51100],index=['age','nickname','login_date','user_id','lover_id']),
pd.Series([19,'dscx','20200623',22,51101],index=['age','nickname','login_date','user_id','lover_id']),
pd.Series([25,'lll','20210323',23,51002],index=['age','nickname','login_date','user_id','lover_id']),
pd.Series([30,'lent','20210601',26,51021],index=['age','nickname','login_date','user_id','lover_id'])
]
df= pd.DataFrame(d,columns=['age','nickname','login_date','user_id','lover_id'])
df
执行结果:
age | nickname | login_date | user_id | lover_id | |
---|---|---|---|---|---|
0 | 21 | jel | 20210623 | 21 | 51100 |
1 | 19 | dscx | 20200623 | 22 | 51101 |
2 | 25 | lll | 20210323 | 23 | 51002 |
3 | 30 | lent | 20210601 | 26 | 51021 |
“==” 匹配
df.loc[df['user_id']>21]
执行结果:
age | nickname | login_date | user_id | lover_id | |
---|---|---|---|---|---|
1 | 19 | dscx | 20200623 | 22 | 51101 |
3 | 30 | lent | 20210601 | 26 | 51021 |
选取某列是否是某一类型的数值 用 isin
df.loc[df['age'].isin([21,19])]
执行结果:
age | nickname | login_date | user_id | lover_id | |
---|---|---|---|---|---|
0 | 21 | jel | 20210623 | 21 | 51100 |
1 | 19 | dscx | 20200623 | 22 | 51101 |
多种条件的选取 用 &
df.loc[(df['age'] <30) & df['user_id'].isin([21,22,23,26])]
执行结果:
age | nickname | login_date | user_id | lover_id | |
---|---|---|---|---|---|
0 | 21 | jel | 20210623 | 21 | 51100 |
1 | 19 | dscx | 20200623 | 22 | 51101 |
2 | 25 | lll | 20210323 | 23 | 51002 |
选取不等于某些值的行记录 用 !=
df.loc[df['login_date'] != 20210623]
执行结果:
age | nickname | login_date | user_id | lover_id | |
---|---|---|---|---|---|
0 | 21 | jel | 20210623 | 21 | 51100 |
1 | 19 | dscx | 20200623 | 22 | 51101 |
2 | 25 | lll | 20210323 | 23 | 51002 |
3 | 30 | lent | 20210601 | 26 | 51021 |
isin返回一系列的数值,如果要选择不符合这个条件的数值使用"~"
df.loc[~df['user_id'].isin([21,22])]
执行结果:
age | nickname | login_date | user_id | lover_id | |
---|---|---|---|---|---|
2 | 25 | lll | 20210323 | 23 | 51002 |
3 | 30 | lent | 20210601 | 26 | 51021 |
html文件在此,有更好的阅读体验
DataFrame-查询与匹配.html.zip
DataFrame-查询与匹配.ipynb.zip
参考文献:
【3】[译]如何根据条件从pandas DataFrame中删除不需要的行? - everfight - 博客园
【4】官网
Pandas 不错的学习资料:joyful-pandas.zip