PyPackage01---Pandas06_取子集subset

  简单的可以分为两类,一类是单纯的行,列取子集(以索引筛选);另一类是筛选出符合要求的子集。先介绍简单的行列subset,后介绍条件筛选。

import pandas as pd
x = pd.DataFrame({'x1':[1,2,3],'x2':[4,5,6],'x3':[7,8,9]})
x
x1x2x3
0147
1258
2369

1.1 取单个列

  返回的数据类型可能不同,要注意下。

## 返回的Series
print(x.x1);type(x.x1)
0    1
1    2
2    3
Name: x1, dtype: int64





pandas.core.series.Series
## 返回的Series
print(x["x1"]);type(x["x1"])
0    1
1    2
2    3
Name: x1, dtype: int64





pandas.core.series.Series
## 这样返回的才是DataFrame
print(x[["x1"]]);type(x[["x1"]])
   x1
0   1
1   2
2   3





pandas.core.frame.DataFrame

1.2 取多个列

## 根据列名
print(x[["x1","x2"]])
   x1  x2
0   1   4
1   2   5
2   3   6
# loc方法
x.loc[:,["x1","x2"]]
x1x2
014
125
236
# iloc方法
x.iloc[:,[0,1]]
x1x2
014
125
236

1.3 取行

## 和列操作一样,单行是Series
print(x.loc[0]);type(x.loc[0])
x1    1
x2    4
x3    7
Name: 0, dtype: int64





pandas.core.series.Series
## 这样,单行是DataFrame
print(x.loc[[0]]);type(x.loc[[0]])
   x1  x2  x3
0   1   4   7





pandas.core.frame.DataFrame
## 取多行是DataFrame
print(x.loc[[0,2]]);type(x.loc[[0,2]])
   x1  x2  x3
0   1   4   7
2   3   6   9





pandas.core.frame.DataFrame

1.4 同时取行和列

  主要有两个函数可以用:loc、iloc。两者的区别在于:loc根据具体列名选取列;而iloc根据列所在位置/索引选取列,从0开始计数。

1.4.1 loc

x.loc[[0,2],['x1','x2']]
x1x2
014
236
## 选取所有行,用:代替
x.iloc[:,[1,2]]
x2x3
047
158
269

1.5 条件过滤-根据值

  根据一定的条件筛选出符合条件的数据,不知道能不能找到类似R里面subset的函数。

1.5.1 逻辑判断

## 涉及到运算优先级的问题,"&"优先级高于所以要加(),改变优先级
x[(x.x2>4) & (x.x3<9)]
x1x2x3
1258

1.5.2 isin

x[x.x1.isin([2])]
x1x2x3
1258

1.5.3 where

  where的语法有点怪,更像是ifelse的处理方式。

x.where(cond, other=nan, inplace=False, axis=None, level=None, try_cast=False, raise_on_error=True)
  1. cond为筛选条件,可以用把代码放在()中
  2. other不满足cond时怎么填补,默认NAN填充
  3. inplace为True时,改变原来数据对象(即other填充之后的数据覆盖原始数据),默认为False,不覆盖
  4. 其余参数不赘
x.where(x.x1 == 2,-x)
x1x2x3
0-1-4-7
1258
2-3-6-9
x.where(cond = (lambda x:x>2),other=(lambda x:x+10))
x1x2x3
01147
11258
2369

1.5.4 query

  这个和R里subset比较接近,但是没有select的功能(即可选地保留最终想要的列)。等号要写成判断的形式"=="

##  条件写成字符串形式,并是and
x.query("x2>4 and x3<9")
x1x2x3
1258

1.6 条件过滤-根据索引

  根据列名(column)or行名(index)进行数据筛选。

DataFrame.filter(items=None, like=None, regex=None, axis=None)

参考:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.filter.html

import pandas as pd
x = pd.DataFrame({'x1': [1, 2, 3], 'x2': [4, 5, 6], 'y1': [7, 8, 9]})

1.6.1 items选择

# 和axis搭配使用,效果更佳
x.filter(items=['x1','x2'],axis = 1)
x1x2
014
125
236
x.filter(items=[0,2],axis = 0)
x1x2y1
0147
2369

1.6.2 regex正则匹配

# 匹配列名为x的列
x.filter(regex='^x',axis = 1)
x1x2
014
125
236
# 匹配行名为0or2的列
x.filter(regex='^[02]',axis = 0)
x1x2y1
0147
2369

1.6.3 like正则匹配

# 匹配列名包含y的列
# 类似于sql中的"%y%"
x.filter(like='y',axis = 1)
y1
07
18
29

                                        2018-10-13 于南京市栖霞区紫东创业园

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值