一文看清楚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


参考文献:

【1】pandas 根据列的值选取所有行

【2】pandas小技巧之--值替换

【3】[译]如何根据条件从pandas DataFrame中删除不需要的行? - everfight - 博客园

【4】官网

Pandas 不错的学习资料:joyful-pandas.zip

Last modification:June 23, 2021
如果觉得我的文章对你有用,请随意赞赏