Pandas 快速数据筛选

Pandas 中数据选择是非常常用且非常重要的基础操作,但是 Pandas 中提供的方法较多且应用灵活,很容易让初学者搞混,尤其是条件筛选或者进行一些局部计算赋值的操作,还是有一定的技巧性。本文总结了一些数据选择方法,包括基础选择和条件选择两大块,内容相对精简且尽量做到一目了然,主要用于速查。

1.构建数据

先构建一套样例数据,以辅助对下面内容的理解。

 ABCD
2019-01-011.624345-0.611756-0.528172-1.072969
2019-01-020.865408-2.3015391.744812-0.761207
2019-01-030.319039-0.2493701.462108-2.060141
2019-01-04-0.322417-0.3840541.133769-1.099891
2019-01-05-0.172428-0.8778580.0422140.582815
2019-01-06-1.1006191.1447240.9015910.502494

2.基础选择

基础选择速查表

方法说明是否可更新值示例
[]/[[]]一列或多列df[‘A’]
df[[‘A’, ‘B’]]
[:]切取行df[0:]
df[1:2]
df[‘A’][0]
注:切片不包含最后一项
loc[,]通过索引标签 (连续) 和列标签选择df.loc[‘2019-01-01’]
df.loc[‘2019-01-02′,’A’]
df.loc[‘2019-01-01′:’2019-01-03′,’A’:’C’]
df.loc[:,[‘C’,’A’]]
注:切片包含最后一项
reindex()通过索引标签 (不连续) 和列标签选择df.reindex(index=ind_list, columns=col_list)
df.reindex(ind_list, axis=’index’)
df.reindex(col_list, axis=’columns’)
df.reindex(index=ind_list, columns=[‘A’,’E’], fill_value=’-999′)(可多出不存在的索引或列,并可选择填充)
注:reindex 不识别字符串形式的时间,因此 ind_list=[‘2019-01-01’, ‘2019-01-03’] 会被认为是新的索引,可使用时间函数转一下 ind_list=pd.to_datetime([‘2019-01-01’, ‘2019-01-03’])
iloc[,]通过行列位置选择df.iloc[0′]
df.iloc[0,0]
df.iloc[0:2,[0,3]]
df.loc[:,[3,1]]
注:切片不包含最后一项
at[,]类似 loc,通过索引标签和列标签选择,只能获取一个值df.at[pd.to_datetime(‘2019-01-01′),’A’]
注:at 不支持字符串时间,需转换
iat[,]类似 iloc,通过行列位置选择,只能选取一个值df.iat[0,2]
ix[]通过混合行列标签和位置选择(基于 loc 和 iloc 的混合, 将弃用,不推荐使用)df.ix[‘2019-01-01′:’2019-01-03’,0:3]
注:可混合标签和位置来选择,基于标签等同于 loc,切片包含最后一项,基于位置等同于 iloc,切片不包含最后一项。
xs()通过行列标签选择,多用于层次化索引df.xs(‘2019-01-01’)
df.xs(‘A’, axis=1)
df.xs((‘index1’, ‘index2’))
df.xs(‘index2’, level=2)
df.xs((‘index1’, 2), level=[0, ‘third’])(选择第一层第三层索引)
get_value()通过行列标签选取单一值(将弃用,不推荐使用,可用 at 或 iat 替代)df.get_value(pd.to_datetime(‘2019-01-06’), ‘A’)
注:该方法不识别字符串形式的时间。
set_value()通过行列标签选取单一目标并更新为指定数值(将弃用,不推荐使用,可用 at 或 iat 替代)df.set_value(pd.to_datetime(‘2019-01-06’), ‘A’, -999)
注:该方法不识别字符串形式的时间。
get_loc()(相关)通过标签获取位置df.index.get_loc(‘2019-01-03’)
df.columns.get_loc(‘C’)
get_slice_bound()(相关)通过标签获取切片位置df.columns.get_slice_bound(‘C’, ‘left’, ‘loc’)
df.index.get_slice_bound(‘2019-01-03’, ‘right’, ‘ix’)

3.条件筛选

3.1.条件构建

条件筛选的本质是通过条件构造一个布尔型索引掩码,然后再进行其他操作,如过滤切分,赋值等。

还有其他形式的条件构造方式,道理是一样的,如下:

3.2.pandas 常规的筛选赋值

 ABCD
2019-01-011.624345-0.611756-0.528172-1.072969
 ABCD
2019-01-011.624345-0.611756-0.528172-999.000000
2019-01-020.865408-2.3015391.744812-0.761207
2019-01-030.319039-0.2493701.462108-2.060141
2019-01-04-0.322417-0.3840541.133769-1.099891
2019-01-05-0.172428-0.8778580.0422140.582815
2019-01-06-1.1006191.1447240.9015910.502494

3.3.使用 df.where 方法筛选赋值

 ABCD
2019-01-011.624345NaN-0.528172NaN
2019-01-020.865408NaNNaNNaN
2019-01-030.319039NaN1.462108NaN
2019-01-04-0.322417NaNNaNNaN
2019-01-05-0.172428NaN0.042214NaN
2019-01-06-1.100619NaNNaNNaN
 ABCD
2019-01-011.624345100.0-0.528172100.0
2019-01-020.865408100.0100.000000100.0
2019-01-030.319039100.01.462108100.0
2019-01-04-0.322417100.0100.000000100.0
2019-01-05-0.172428100.00.042214100.0
2019-01-06-1.100619100.0100.000000100.0

3.4.使用 np.where 方法筛选赋值

 ABCD
2019-01-01-100100-100100
2019-01-02-100100100100
2019-01-03-100100-100100
2019-01-04-100100100100
2019-01-05-100100-100100
2019-01-06-100100100100

3.5.使用 df.isin 方法筛选赋值

 ABCD
2019-01-011.624345-0.611756-0.528172NaN
2019-01-020.865408-2.3015391.744812-0.761207
2019-01-030.319039-0.2493701.462108-2.060141
2019-01-04-0.322417-0.3840541.133769-1.099891
2019-01-05-0.172428-0.8778580.0422140.582815
2019-01-06-1.1006191.1447240.9015910.502494

3.6.缺失值和无效值的条件选择

 ABCD
2019-01-01FalseFalseFalseTrue
2019-01-02FalseFalseFalseFalse
2019-01-03FalseFalseFalseFalse
2019-01-04FalseFalseFalseFalse
2019-01-05FalseFalseFalseFalse
2019-01-06FalseFalseFalseFalse
 ABCD
2019-01-01TrueTrueTrueFalse
2019-01-02TrueTrueTrueTrue
2019-01-03TrueTrueTrueTrue
2019-01-04TrueTrueTrueTrue
2019-01-05TrueTrueTrueTrue
2019-01-06TrueTrueTrueTrue
© 除特别注明外,本站所有文章均为卢明冬的博客原创 , 转载请联系作者。
© 本文链接:https://lumingdong.cn/pandas-quick-search-data-selection.html
相关文章
评论 ( 6 )
  1. ivy
    2020-04-17 17:38
    回复

    您好,想请问一下如果想从 dataframe 中选取每一行中前 2 的值并进行赋值,该怎么写筛选规则呢?

    • 卢明冬
      卢明冬
      2020-04-17 19:15
      回复

      前 2 的意思是前两列还是前两个最大值 (最小值),你再详细描述一下。

      • IVY
        2020-04-17 19:26
        回复

        是每一行中排名前 2(最大值)的值。index 同样是日期,筛选出每一行中 2 个最大值,再对这两个最大值进行赋值

        • 卢明冬
          卢明冬
          2020-04-17 21:37
          回复

          我先假定你要赋的值是同一个,我这里用-999 表示。可参考下面的代码:

          def max_2num(row):
              return row.sort_values(ascending=False)[:2]
          df[~df.apply(max_2num, axis=1).isnull()]=-999
          • ivy
            2020-04-17 23:26

            您好,感谢您的回答,但是我这边输入之后报错 max_7num() got an unexpected keyword argument ‘axis’,您知道是什么原因吗?

          • 卢明冬
            卢明冬
            2020-04-18 08:39

            你检查下是不是哪里写错了,axis 是 apply 的参数,不是 max_7num 的。

发布一条评论吧