文档章节

Pandas 数据框增、删、改、查、去重、抽样基本操作

C
 Claroja
发布于 2017/05/08 23:22
字数 1322
阅读 150
收藏 0

总括

pandas的索引函数主要有三种:
loc 标签索引,行和列的名称
iloc 整型索引(绝对位置索引),绝对意义上的几行几列,起始索引为0
ix 是 iloc 和 loc的合体
at是loc的快捷方式
iat是iloc的快捷方式

建立测试数据集:

import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c'],'c': ["A","B","C"]})
print(df)
   a  b  c
0  1  a  A
1  2  b  B
2  3  c  C

行操作

选择某一行

print(df.loc[1,:])
a    2
b    b
c    B
Name: 1, dtype: object

选择多行

print(df.loc[1:2,:])#选择1:2行,slice为1
   a  b  c
1  2  b  B
2  3  c  C
print(df.loc[::-1,:])#选择所有行,slice为-1,所以为倒序
   a  b  c
2  3  c  C
1  2  b  B
0  1  a  A
print(df.loc[0:2:2,:])#选择0至2行,slice为2,等同于print(df.loc[0:2:2,:])因为只有3行
   a  b  c
0  1  a  A
2  3  c  C

条件筛选

普通条件筛选

print(df.loc[:,"a"]>2)#原理是首先做了一个判断,然后再筛选
0    False
1    False
2     True
Name: a, dtype: bool
print(df.loc[df.loc[:,"a"]>2,:])
   a  b  c
2  3  c  C

另外条件筛选还可以集逻辑运算符 | for or, & for and, and ~for not

In [129]: s = pd.Series(range(-3, 4))
In [132]: s[(s < -1) | (s > 0.5)]
Out[132]: 
0   -3
1   -2
4    1
5    2
6    3
dtype: int64

isin

非索引列使用isin

In [141]: s = pd.Series(np.arange(5), index=np.arange(5)[::-1], dtype='int64')
In [143]: s.isin([2, 4, 6])
Out[143]: 
4    False
3    False
2     True
1    False
0     True
dtype: bool

In [144]: s[s.isin([2, 4, 6])]
Out[144]: 
2    2
0    4
dtype: int64

索引列使用isin

In [145]: s[s.index.isin([2, 4, 6])]
Out[145]: 
4    0
2    2
dtype: int64

# compare it to the following
In [146]: s[[2, 4, 6]]
Out[146]: 
2    2.0
4    0.0
6    NaN
dtype: float64

结合any()/all()在多列索引时

In [151]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'f', 'n'],
   .....:                    'ids2': ['a', 'n', 'c', 'n']})
   .....: 
In [156]: values = {'ids': ['a', 'b'], 'ids2': ['a', 'c'], 'vals': [1, 3]}

In [157]: row_mask = df.isin(values).all(1)

In [158]: df[row_mask]
Out[158]: 
  ids ids2  vals
0   a    a     1

where()

In [1]: dates = pd.date_range('1/1/2000', periods=8)

In [2]: df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])

In [3]: df
Out[3]: 
                   A         B         C         D
2000-01-01  0.469112 -0.282863 -1.509059 -1.135632
2000-01-02  1.212112 -0.173215  0.119209 -1.044236
2000-01-03 -0.861849 -2.104569 -0.494929  1.071804
2000-01-04  0.721555 -0.706771 -1.039575  0.271860
2000-01-05 -0.424972  0.567020  0.276232 -1.087401
2000-01-06 -0.673690  0.113648 -1.478427  0.524988
2000-01-07  0.404705  0.577046 -1.715002 -1.039268
2000-01-08 -0.370647 -1.157892 -1.344312  0.844885
In [162]: df.where(df < 0, -df)
Out[162]: 
                   A         B         C         D
2000-01-01 -2.104139 -1.309525 -0.485855 -0.245166
2000-01-02 -0.352480 -0.390389 -1.192319 -1.655824
2000-01-03 -0.864883 -0.299674 -0.227870 -0.281059
2000-01-04 -0.846958 -1.222082 -0.600705 -1.233203
2000-01-05 -0.669692 -0.605656 -1.169184 -0.342416
2000-01-06 -0.868584 -0.948458 -2.297780 -0.684718
2000-01-07 -2.670153 -0.114722 -0.168904 -0.048048
2000-01-08 -0.801196 -1.392071 -0.048788 -0.808838

DataFrame.where() differs from numpy.where()的区别

In [172]: df.where(df < 0, -df) == np.where(df < 0, df, -df)

当series对象使用where()时,则返回一个序列

In [141]: s = pd.Series(np.arange(5), index=np.arange(5)[::-1], dtype='int64')
In [159]: s[s > 0]
Out[159]: 
3    1
2    2
1    3
0    4
dtype: int64
In [160]: s.where(s > 0)
Out[160]: 
4    NaN
3    1.0
2    2.0
1    3.0
0    4.0
dtype: float64

抽样筛选

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
当在有权重筛选时,未赋值的列权重为0,如果权重和不为1,则将会将每个权重除以总和。random_state可以设置抽样的种子(seed)。axis可是设置列随机抽样。

In [105]: df2 = pd.DataFrame({'col1':[9,8,7,6], 'weight_column':[0.5, 0.4, 0.1, 0]})

In [106]: df2.sample(n = 3, weights = 'weight_column')
Out[106]: 
   col1  weight_column
1     8            0.4
0     9            0.5
2     7            0.1

增加行

df.loc[3,:]=4
     a  b  c
0  1.0  a  A
1  2.0  b  B
2  3.0  c  C
3  4.0  4  4

插入行

pandas里并没有直接指定索引的插入行的方法,所以要自己设置

line = pd.DataFrame({df.columns[0]:"--",df.columns[1]:"--",df.columns[2]:"--"},index=[1])
df = pd.concat([df.loc[:0],line,df.loc[1:]]).reset_index(drop=True)#df.loc[:0]这里不能写成df.loc[0],因为df.loc[0]返回的是series
     a  b  c
0  1.0  a  A
1  --  -- --
2  2.0  b  B
3  3.0  c  C
4  4.0  4  4

交换行

df.loc[[1,2],:]=df.loc[[2,1],:].values
   a  b  c
0  1  a  A
1  3  c  C
2  2  b  B

删除行

df.drop(0,axis=0,inplace=True)
print(df)
   a  b  c
1  2  b  B
2  3  c  C

注意

在以时间作为索引的数据框中,索引是以整形的方式来的。

In [39]: dfl = pd.DataFrame(np.random.randn(5,4), columns=list('ABCD'), index=pd.date_range('20130101',periods=5))

In [40]: dfl
Out[40]: 
                   A         B         C         D
2013-01-01  1.075770 -0.109050  1.643563 -1.469388
2013-01-02  0.357021 -0.674600 -1.776904 -0.968914
2013-01-03 -1.294524  0.413738  0.276662 -0.472035
2013-01-04 -0.013960 -0.362543 -0.006154 -0.923061
2013-01-05  0.895717  0.805244 -1.206412  2.565646
In [41]: dfl.loc['20130102':'20130104']
Out[41]: 
                   A         B         C         D
2013-01-02  0.357021 -0.674600 -1.776904 -0.968914
2013-01-03 -1.294524  0.413738  0.276662 -0.472035
2013-01-04 -0.013960 -0.362543 -0.006154 -0.923061

列操作

选择某一列

print(df.loc[:,"a"])
0    1
1    2
2    3
Name: a, dtype: int64

选择多列

print(df.loc[:,"a":"b"])
   a  b
0  1  a
1  2  b
2  3  c

增加列,如果对已有的列,则是赋值

df.loc[:,"d"]=4
   a  b  c  d
0  1  a  A  4
1  2  b  B  4
2  3  c  C  4

交换两列的值

df.loc[:,['b', 'a']] = df.loc[:,['a', 'b']].values
print(df)
   a  b  c
0  a  1  A
1  b  2  B
2  c  3  C

删除列

1)直接del DF[‘column-name’]

2)采用drop方法,有下面三种等价的表达式:

DF= DF.drop(‘column_name’, 1);

DF.drop(‘column_name’,axis=1, inplace=True)

DF.drop([DF.columns[[0,1,]]], axis=1,inplace=True)

df.drop("a",axis=1,inplace=True)
print(df)
   b  c
0  a  A
1  b  B
2  c  C

还有一些其他的功能:
切片df.loc[::,::]
选择随机抽样df.sample()
去重.duplicated()
查询.lookup

© 著作权归作者所有

共有 人打赏支持
C
粉丝 0
博文 128
码字总数 44892
作品 0
南京
(转载)Python数据分析之pandas学习

转载地址:http://www.cnblogs.com/nxld/p/6058591.html Python中的pandas模块进行数据分析。 接下来pandas介绍中将学习到如下8块内容: 1、数据结构简介:DataFrame和Series 2、数据索引ind...

fjssharpsword
2017/11/28
0
0
完整的权限管理系统 - LaySSH

LaySSH是一款完全开源免费的开发框架,基于LayUI+SpringMVC+Spring+Hibernate+Mysql搭建而成,内置代码生成器,能够快速生成增删改查代码,节省开发时间,快速构建企业级的web应用系统。 该框...

herun
02/02
0
0
Python的基础知识之常用类型-列表

每种语言都有基本的数据类型,比如整型、浮点型、字符串、列表等,但是小编今天主要记录列表数据类型。 tmpdir17971506_52.gif 列表(list) 在Python中有序可变的元素集合叫做列表,其他语言...

摸着石头过河_崖边树
2017/12/15
0
0
【mysql】mysql增改查删基本命令以及备份操作

实验环境 虚拟化设备:Esxi6.0 系统:Redhat7 数据库:mariaDB #操作与mysql相同 第18章 使用MariaDB数据库管理系统。 学会4种备份MySQL数据库(基本备份方面没问题了) 一、初始化mariaDB服...

bestlope
04/15
0
0
Web APi之EntityFramework【CRUD】(三)

前言 之前我们系统学习了EntityFramework,个人觉得有些东西不能学了就算完了,必须要学以致用,在Web API上也少不了增(C)、删(D)、改(U)、查(R)。鉴于此,我们通过EF来实现Web API...

jeffcky
2015/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

兄弟连区块链教程之以太坊源码分析交易数据分析

交易的数据结构 交易的数据结构定义在core.types.transaction.go中,结构如下: type Transaction struct {data txdata// cacheshash atomic.Valuesize atomic.Valuefrom atomic.V...

兄弟连区块链入门教程
21分钟前
1
0
Tomcat优化经验之谈

Tomcat优化经验之谈 程序员小新人学习 2018-07-23 12:09:36 由于刚做完一个tomcat,jboss,Oracle性能优化项目,想做个总结。写写项目过程中对他们优化过程的理解。 tomcat安装配置就不讲啦(...

两广总督bogang
28分钟前
2
0
Spark中foreachPartition和mapPartitions的区别

spark的运算操作有两种类型:分别是Transformation和Action,区别如下: Transformation:代表的是转化操作就是我们的计算流程,返回是RDD[T],可以是一个链式的转化,并且是延迟触发的。 Ac...

张泽立
30分钟前
2
0
git reset 和 git revert, git log 和 git reflog 比较

前言:仙儿苦设相思局,寻欢误入冷香处 故事背景: 那一晚 月黑风高之夜 李寻欢 在自诩为江湖正义的一群伪君子设计好的圈套(repository)中做了(commit)三件事:              ...

猿神出窍
41分钟前
1
0
kotlin使用spring mvc(一)

过滤器Filter,是Servlet的一种技术。可通过Filter,对请求进行拦截,比如判断用户是否登录、验证黑名单等并且可对请求进行预处理。 接下来介绍使用WebFilter配置过滤器并实现读取cookie判断...

weidedong
45分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部