Pandas是python的一个数据分析包,主要用于数据挖掘和数据分析,通过Pandas我们可以高效地操作大型数据集。下面将给大家介绍一下Pandas中的两大主要结构:Series和DataFrame及其索引操作。

1. pandas主要结构

1.1 Series

系列(Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组。

1.1.1 创建Series

pandas.Series(data,index,dtype,copy)

  • data:数据采取各种形式,如:ndarray,list

  • index:索引值必须是唯一的和散列的,与数据的长度相同。

  • dtype:指定数据类型。如果没有,将推断数据类型

  • copy:复制数据,默认为false

可以通过输入数组、字典等方式来创建一个系列

import pandas as pd

import numpy as np

data1 = np.array(['a','b','c','d'])

data2 = {'a':0.,'b':1.,'c':2.}

s1 = pd.Series() # 创建一个空的Series

s2 = pd.Series(data1) # 从ndarray创建一个Series.这里没有传递任何索引

s3 = pd.Series(data1,index=[100,101,102,103]) #这里传递了索引值。

s4 = pd.Series(data2) # 从字典中创建一个Series.注意,字典键用于构建索引

s5 = pd.Series(data2,index=['b','c','d','a']) # 索引顺序保持不变,缺少的元素使用NaN填充

s6 = pd.Series(5,index=[0,1,2,3]) # 从标量创建一个Series

print(s1,s2,s3,s4,s5,s6)

输出结果

#s1

Series([], dtype: float64)

#s2 默认情况下,分配了从0到len(data)-1的索引

0 a

1 b

2 c

3 d

dtype: object

#s3 可以在输出中看到自定义的索引值

100 a

101 b

102 c

103 d

dtype: object

#s4

a 0.0

b 1.0

c 2.0

dtype: float64

#s5

b 1.0

c 2.0

d NaN

a 0.0

dtype: float64

#s6

0 5

1 5

2 5

3 5

dtype: int64

1.1.2 访问数据

系列(Series)中的数据可以使用类似于访问ndarray中的数据来访问。

1)从具有位置的Series中访问数据:

s = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])

print(s[0]) # 检索第一个元素

print(s[:3]) # 检索Series中前三个元素

print(s[-3:]) # 检索最后三个元素

输出结果

#s[0]

1

#s[:3]

a 1

b 2

c 3

dtype: int64

#s[-3:]

c 3

d 4

e 5

dtype: int64

2)使用标签检索数据

# 一个Series就像一个固定大小的字典,可以通过索引标签获取和设置值

s = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])

print(s['a']) # 使用索引标签值检索单个元素

print(s[['a','b','c']]) # 使用索引标签值检索多个元素。注意,如果索引不存在的标签,则会报错

输出结果:

#s['a']

1

#s[['a','b','c']]

a 1

b 2

c 3

dtype: int64

1.1.3 Series 基本功能

基本功能如下所示:

下面我们通过举例来加深印象~

s = pd.Series(np.random.randn(4))

print(s.axes) # 返回Series的标签列表

print(s.empty) # 返回布尔值,表示对象是否为空

print(s.ndim) # 返回对象的维数

print(s.size) # 返回Series的大小

print(s.values) # 以数组形式返回Series中的实际数据值

print(s.head(2)) # 显示前2行

print(s.tail(2)) # 返回最后2行

输出结果:

#s.axes

[RangeIndex(start=0, stop=4, step=1)]

#s.empty

False

#s.ndim

1

#s.size

4

#s.values

[ 0.9376181 -0.15342991 -1.85860809 -0.9484854 ]

#s.head(2)

0 0.937618

1 -0.153430

dtype: float64

#s.tail(2)

2 -1.858608

3 -0.948485

dtype: float64

1.2 DataFrame

数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列。

1.2.1 DataFrame创建

pandas.DataFrame(data,index,columns,dtype,copy)

  • data: 数据采用各种形式,如:ndarray,series,lists,dict或另一个DataFrame

  • index: 行标签,如果没有传入,默认为np.arange(n)

  • columns: 列标签,如果没有传入索引,则默认np.arange(n)

  • dtype: 每列的数据类型

  • copy: 默认值为False,则此命令用于复制数据

DataFrame可以通过以下方法进行创建

data1 = [1,2,3,4,5]

data2 = [['A',10],['B',12],['C',13]]

df1 = pd.DataFrame() # 创建一个空的DataFrame

df2 = pd.DataFrame(data1) # 从列表创建DataFrame

df3 = pd.DataFrame(data2,columns=['Name','Age']) # 传入多个列表来创建DataFrame

df4 = pd.DataFrame(data2,columns=['Name','Age'],dtype = float) #dtype将Age列的类型更改为浮点

print(df1,df2,df3,df4)

输出结果:

#df1

Empty DataFrame

Columns: []

Index: []

#df2

0

0 1

1 2

2 3

3 4

4 5

#df3

Name Age

0 A 10

1 B 12

2 C 13

#df4

Name Age

0 A 10.0

1 B 12.0

2 C 13.0

除此之外,还可以使用字典来创建dataframe:

data3 = {'Name':['T','J','S','R'],'Age':[28,34,29,42]}

data4 = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]

data5 = {'one':pd.Series([1,2,3],index=['a','b','c']),

'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}

# 从ndarrays/Lists的字典来创建DataFrame。

# 所有的ndarrays必须具有相同的长度。如果传递了索引(index),则索引的长度应等于数组的长度。

df5 = pd.DataFrame(data3)

df6 = pd.DataFrame(data3,index=['rank1','rank2','rank3','rank4']) # 通过index参数,设置index的名字

df7 = pd.DataFrame(data4) # 从列表创建DataFrame,NaN附加在缺失的区域

df8 = pd.DataFrame(data5) # 从Series的字典来创建DataFrame

输出结果:

#df5

Age Name

0 28 T

1 34 J

2 29 S

3 42 R

#df6

Age Name

rank1 28 T

rank2 34 J

rank3 29 S

rank4 42 R

#df7

a b c

0 1 2 NaN

1 5 10 20.0

#df8

one two

a 1.0 1

b 2.0 2

c 3.0 3

d NaN 4

1.2.2 列、行相关操作

(1)列选择

从数据帧(DataFrame)中选择一列。

data = {'one':pd.Series([1,2,3],index=['a','b','c']),

'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}

df = pd.DataFrame(data)

print(df['one']) # 查询某一列

print(df[['one','two']]) # 查询多列

输出结果:

#df['one']

a 1.0

b 2.0

c 3.0

d NaN

Name: one, dtype: float64

#df[['one','two']]

one two

a 1.0 1

b 2.0 2

c 3.0 3

d NaN 4

(2)列添加

向现有数据框添加一个新列

# 向现有数据框添加一个新列

df['three'] = pd.Series([10,20,30],index=['a','b','c'])

df['four'] = df['one'] + df['two'] # 观测结果发现,NAN与其他常数相加的结果还是为NaN

print(df)

输出结果:

one two three four

a 1.0 1 10.0 2.0

b 2.0 2 20.0 4.0

c 3.0 3 30.0 6.0

d NaN 4 NaN NaN

(3)列删除

列可以删除或弹出。使用del函数进行删除:

# 删除one列

del df['one']

df

输出结果

two three four

a 1 10.0 2.0

b 2 20.0 4.0

c 3 30.0 6.0

d 4 NaN NaN

使用pop函数进行弹出:

# 弹出two列

df.pop('two')

df

输出结果

three four

a 10.0 2.0

b 20.0 4.0

c 30.0 6.0

d NaN NaN

(4)行选择,添加和删除

可以通过将行标签传递给loc()函数来选择行,也可以使用 : 运算符选择多行进行切片:

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),

'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)

print(df.loc['b']) # 查询index为b的行

print(df[2:4]) #选择第3-4行

输出结果:

#df.loc['b']

one 2.0

two 2.0

Name: b, dtype: float64

#df[2:4]

one two

c 3.0 3

d NaN 4

还可以使用append()函数将新行添加到DataFrame,使用drop()函数从DataFrame中删除行。

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])

df2 = pd.DataFrame([[5, 6],[7, 8]],columns=['a','b'])

print(df)

df = df.append(df2)

print(df)

df = df.drop(0) # 根据index来删除

print(df)

输出结果:

a b

0 1 2

1 3 4

#增加行

a b

0 1 2

1 3 4

0 5 6

1 7 8

#删除行

a b

1 3 4

1 7 8

1.2.3 DataFrame基本功能

基本功能如下所示:

具体使用案例如下:

# 生成样例数据

d = {'Name':pd.Series(['T','J','R','V','S','M','Ja']),

'Age':pd.Series([25,26,25,23,30,29,23]),

'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

df = pd.DataFrame(d)

print(df.T) #T 转置

print(df.axes) # 返回行轴标签和列轴标签列表

print(df.dtypes) # 返回每列的数据类型

print(df.empty) # 表示对象是否为空

print(df.ndim) # 返回对象的维度

print(df.shape) # 返回DataFrame的维度元组

print(df.size) # 返回DataFrame中的元素数

print(df.values) # 将DataFrame中的实际数据作为NDarray返回

print(df.head()) # 显示前5行

print(df.tail()) # 显示最后5行

输出结果:

#df.T

0 1 2 3 4 5 6

Name T J R V S M Ja

Age 25 26 25 23 30 29 23

Rating 4.23 3.24 3.98 2.56 3.2 4.6 3.8

#df.axes

[RangeIndex(start=0, stop=7, step=1), Index(['Name', 'Age', 'Rating'], dtype='object')]

#df.dtypes

Name object

Age int64

Rating float64

dtype: object

#df.empty

False

#df.ndim

2

#df.shape

(7, 3)

#df.size

21

#df.values

[['T' 25 4.23]

['J' 26 3.24]

['R' 25 3.98]

['V' 23 2.56]

['S' 30 3.2]

['M' 29 4.6]

['Ja' 23 3.8]]

#df.head()

Name Age Rating

0 T 25 4.23

1 J 26 3.24

2 R 25 3.98

3 V 23 2.56

4 S 30 3.20

#df.tail())

Name Age Rating

2 R 25 3.98

3 V 23 2.56

4 S 30 3.20

5 M 29 4.60

6 Ja 23 3.80

2. pandas索引使用

2.1 Pandas索引和选择数据

Pandas支持三种类型的多轴索引,描述如下:

2.1.1 .loc()

loc 具有多种访问方式,具体可以查看以下例子:

df = pd.DataFrame(np.random.randn(4,2),index = ['a','b','c','d'],columns=['A','B'])

print(df.loc[:,'A']) # 查询所有行的'A'列

print(df.loc[:,['A','B']]) # 查询多列

print(df.loc[['a','b'],['A','B']]) # 根据标签查询对应的行和列

print(df.loc['a':'d']) # 查询a行到h列

print(df.loc['a']>0)

输出结果:

#df.loc[:,'A']

a 2.377338

b 1.042437

c 0.708036

d -1.308075

Name: A, dtype: float64

#df.loc[:,['A','B']]

A B

a 2.377338 -0.330571

b 1.042437 -0.058175

c 0.708036 1.611788

d -1.308075 0.947314

#df.loc[['a','b'],['A','B']]

A B

a 2.377338 -0.330571

b 1.042437 -0.058175

#df.loc['a':'d']

A B

a 2.377338 -0.330571

b 1.042437 -0.058175

c 0.708036 1.611788

d -1.308075 0.947314

#df.loc['a']>0

A True

B False

Name: a, dtype: bool

2.1.2 纯整数索引

.iloc()的索引方法与loc类似

print(df.iloc[:4]) # 查询前4行

print(df.iloc[1:3,1:]) # 查询第2-3行和第一列之外的列

输出结果:

#df.iloc[:4]

A B

a 2.377338 -0.330571

b 1.042437 -0.058175

c 0.708036 1.611788

d -1.308075 0.947314

#df.iloc[1:3,1:]

B

b -0.058175

c 1.611788

2.1.3 ix索引

Pandas还提供了一种使用.ix()运算符进行选择和子集化对象的混合方法。

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

print(df.ix[:4]) # 查询标签为0到4的行

print(df.ix[:,'A']) # 查找A列

输出结果:

#df.ix[:4]

A B C

0 -0.413357 -0.167940 0.542721

1 1.695521 -0.447831 -0.433989

2 1.040637 -0.429264 0.945254

#df.iloc[df.ix[:,'A']]

0 -0.413357

1 1.695521

2 1.040637

Name: A, dtype: float64

2.2 Pandas重建索引

重新索引会更改DataFrame的行标签和列标签。

可以通过索引来实现多个操作:

  • 重新排序现有数据以匹配一组新的标签

  • 在没有标签数据的标签位置插入缺失值(NA)标记

df = pd.DataFrame({

'A': pd.date_range(start='2019-01-01',periods=20,freq='D'),

'x': np.linspace(0,stop=20-1,num=20),

'y': np.random.rand(20),

'C': np.random.choice(['Low','Medium','High'],20).tolist(),

'D': np.random.normal(100, 10, size=(20)).tolist()

})

# 重建索引

df_reindexed = df.reindex(index=[0,2,5],columns=['A','C','B']) # 原本没有B列,所以B列的值都为NaN

print(df_reindexed)

输出结果:

A C B

0 2019-01-01 High NaN

2 2019-01-03 Medium NaN

5 2019-01-06 High NaN

2.2.1 重建索引与其他对象对齐

如果想让一个对象和另一个对象的轴标记相同。那么我们可以通过如下方法来实现

# 构建样例数据

df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])

df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])

print(df1,df2)

样例数据为:

#df1

col1 col2 col3

0 0.116654 -0.920242 -0.094980

1 0.997855 0.085608 -1.738815

2 1.443946 0.019549 0.251528

3 -1.212119 -1.210960 0.147220

4 0.788829 2.812478 -0.393173

5 1.139606 1.718862 -0.949964

6 1.123598 -1.121778 0.035585

7 -0.200309 0.043714 0.287871

8 -0.553097 -0.334700 -0.648229

9 -1.081606 -0.174223 0.057483

#df2

col1 col2 col3

0 1.362711 2.126439 -0.294538

1 1.062274 1.118789 -0.180609

2 -0.446018 -0.036722 -1.754342

3 0.496308 0.287495 -0.544084

4 0.394956 2.235108 -0.087951

5 1.242660 0.346076 0.685478

6 0.094422 0.742144 0.743658

reindex_like()让一个对象和另一个对象有相同的index 和 colums:

df1 = df1.reindex_like(df2) # 将df1的index和columns都转换成跟df2的index、columns一样

print(df1)

结果为:

col1 col2 col3

0 0.116654 -0.920242 -0.094980

1 0.997855 0.085608 -1.738815

2 1.443946 0.019549 0.251528

3 -1.212119 -1.210960 0.147220

4 0.788829 2.812478 -0.393173

5 1.139606 1.718862 -0.949964

6 1.123598 -1.121778 0.035585

2.2.2 填充时重新加注

reindex_like()采用可选参数方法,它是一个填充方法,其值如下:

  • pad/ffill: 向前填充值

  • bfill/backfill: 向后填充值

  • nearest: 从最近的索引值填充

# 构建样例数据

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])

df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])

print(df2.reindex_like(df1))

print(df2.reindex_like(df1,method='ffill')) # 向前填充,用前面的值来填充NaN

结果为:

#df2.reindex_like(df1)

col1 col2 col3

0 0.176328 0.841434 -0.714321

1 -0.779040 2.391771 -1.126933

2 NaN NaN NaN

3 NaN NaN NaN

4 NaN NaN NaN

5 NaN NaN NaN

#df2.reindex_like(df1,method='ffill')

col1 col2 col3

0 0.176328 0.841434 -0.714321

1 -0.779040 2.391771 -1.126933

2 -0.779040 2.391771 -1.126933

3 -0.779040 2.391771 -1.126933

4 -0.779040 2.391771 -1.126933

5 -0.779040 2.391771 -1.126933

使用limit参数进行填充限制:

df2.reindex_like(df1,method='ffill',limit=1)

结果为:

col1 col2 col3

0 0.176328 0.841434 -0.714321

1 -0.779040 2.391771 -1.126933

2 -0.779040 2.391771 -1.126933

3 NaN NaN NaN

4 NaN NaN NaN

5 NaN NaN NaN

2.2.3 重命名

使用rename()来更改行名和列名

# 使用rename修改列名

df1.rename(columns={'col1':'c1','col2':'c2'}, # 将col1更改为c1,col2更改为c2

index = {0:'a',1:'b',2:'c'},

inplace=True) # inplace默认为False

print(df1)

结果为:

c1 c2 col3

a 1.393154 0.510697 -1.160332

b -0.952572 -0.257124 2.261260

c -0.196542 -0.817034 1.297915

3 -0.110799 2.349779 -0.869405

4 -0.632141 -1.251734 1.320231

5 -0.576398 -1.051619 -0.053604


至此,本次分享已结束如果你喜欢的话,可以转发或者点个“在看”支持一下~点击原文链接,可以下载《Python工具代码速查手册》,可以点个star支持一下哦~简介:浩彬老撕好玩的数据炼丹师,曾经的IBM数据挖掘攻城狮,还没开始就过气数据科学界的段子手,致力于数据科学知识分享,不定期送书活动

python 列表的行 列长度_Python连载|Pandas手册(上)相关推荐

  1. python列表元素零的移动_python列表多行

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这个列表推导式共有145列: memberdef_list = and std: ...

  2. python列表嵌套字典取值_Python基础语法:你不得不知的几种变量类型

    (点击上方快速关注并设置为星标,一起学Python) 作者:kina_chen來源:简书 01. Python编码Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字, ...

  3. python中如何计算集合的长度_Python如何计算序列长度 python dataframe中元素如何统计?...

    如何在python列表中查找某个元素的索引 方法二:利用enumerate函数.没有任何一个男人,可以游手好闲赢得女人的欣赏. python dataframe中元素如何统计? 比如我有一个数据集a, ...

  4. python列表中怎么去掉空值_Python 如何删除列表中的空值

    今天在获取android性能CPU测试数据时,发现这么一个问题: # -*- coding:utf-8 -*- import os import time cpuInfo = os.popen(r'a ...

  5. python从命令行获取参数_python从命令行获取参数操作

    python从命令行获取参数 一: 简单用法 从命令行获取参数两种方式: 1.通过sys.argv参数获取:代码如下: # -*- coding: utf-8 -*- import sys #获取输入 ...

  6. python列表元素下标是什么_python列表中元素插入位置总结

    python列表中元素插入位置总结 , python中列表去掉最后一个元素 ist.insert(index,obj) 列表与方法之间用点号相隔,括号内需要添入的参数分别是索引和要插入的元素. 要完成 ...

  7. python从第二行开始写_Python第2课 - 第一个Python程序

    在本节课中,你将运行自己的第一个程序 -- hello_world.py.在这之前,需要熟悉两个概念:命令行模式和Python交互模式.同时掌握输入和输出. 1. 命令行模式和Python交互模式 1 ...

  8. python对比excel两列数据_python 对比excel表格数据表-python实现两个excel表列数据对比若源表与目标表存......

    在数据分析方面,比起python,excel的局限性在哪 data3 = pandas.merge(data1, data2, on=['名称'], how='inner') inner:内连接,取交 ...

  9. python列表类型用什么表示_python内置类型:列表,包括 list 和 tuple

    列表list 是一种有序的集合 ,假定list的名字为class list的元素个数:len( class) 访问元素: a. 索引从0开始 b. 也可以使用[-1],[-2],[-3] 从后面访问元 ...

  10. python列表使用技巧与方法_Python列表的相关操作与方法

    Python列表的相关操作与方法 1.列表 why:int.bool.str存在缺陷 str:存储少量的数据:所有的操作获取的内容都是 str类型,存储的数据类型单一. what: 列表可以承载任意数 ...

最新文章

  1. 医疗领域中的AI/ML机会前景
  2. [分享]写出健壮的Bash脚本
  3. python开发工程师面试题-超实用面试必看,Python工程师面试题
  4. 替换某个目录下的文本文件内容字符串
  5. webService 使用CXF 实现简单的helloworld
  6. SQL Server--实体再复习
  7. SAP CRM和Hybris里的Product Variant
  8. missforest_missforest最佳丢失数据插补算法
  9. 如何防止表单的重复提交
  10. Windows 10 LTSB 还原默认照片查看器
  11. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断...
  12. Boost升压电路调试
  13. 纯CSS3代码制作六边形图形教程
  14. 卡西欧计算机做英语,卡西欧的这个小萌物 原来是台英语学习机
  15. java查找pdf关键字_Java定位PDF中关键字的坐标
  16. GDrive首次现身!
  17. cpuid limit_Max CPUID Valut Limit 请懂电脑的解答下 谢谢!
  18. 五大学科竞赛(三)-o2 -lm编译选项
  19. 纯CSS实现手风琴效果(附演示)
  20. 在职场要避免这些“潜规则”

热门文章

  1. 计算机培训实践反思模板,基于问题解决式课堂教学模式的反思
  2. mysql连接不用数据库名称_C++连接MySQL数据库
  3. python获取视频缩略图_Python代码生成视频的缩略图的实例讲解
  4. flutter html 加载_实操 | 在 Flutter 中创建通信桥
  5. 用java写出死锁的例子_【面试】请写一个java死锁的例子-Go语言中文社区
  6. 单片机r6/r7c语言怎么用,第5章MCU混合编程与C语言和汇编语言
  7. Spring基于注解管理bean(一文搞懂注解及使用注解)
  8. Uber和Lyft推个人验证PIN码功能降接送混乱
  9. 以太坊上海协议之——达成Cosmos网络实现以太坊扩容协议
  10. Solr Dataimporthandler 导入MySQL 内存溢出。