数据导入和整理模块—pandas

pandas

前言

pandas模块是基于NumPy模块的一个开源Python模块,广泛应用于完成数据快速分析、数据清洗和准备等工作,它的名字来源于”panel data”(面板数据)。

pandas模块提供了非常直观的数据结构及强大的数据管理和数据处理功能,某种程度上可以把pandas模块看成Python版的Excel。如果是利用Anaconda安装的Python,则自带pandas模块,无须单独安装。与NumPy模块相比,pandas模块更擅长处理二维数据,其主要有Series和DataFrame
两种数据结构。

(一)、 Series 创建一维数组

import pandas as pd

s = pd.Series(['丁一','王二','张三'])
print(s)

运行结果

0    丁一
1    王二
2    张三
dtype: object

看到s是一个一维数组结构,并且每个元素都有一个可以用来定位的行索引,
如s[1]可以定位到王二。

(二)、二维数组表格 DataFrame 的创建与索引的修改

一、 DataFrame 的创建

DataFrame 可以通过列表、字典或二维数组来创建。

1、通过列表来创建

利用 pandas模块中的 DataFrame()函数来创建

import pandas as pd

a = pd.DataFrame([[1,2],[3,4],[5,6]])
print(a)

运行结果

   0  1
0  1  2
1  3  4
2  5  6

通过与 NumPy模块创建的二维数组比较可以发现,DataFrame更像Excel中的二维表格,它也有行索引和列索引。需要注意的是,这里的索引序号是从0开始的。

我们还可以在创建DataFrame时自定义列索引和行索引,演示代码如下:

import pandas as pd

a = pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['A','B','C'])
print(a)

运行结果

   date  score
A     1      2
B     3      4
C     5      6

用列表来创建还有另一种方式,演示代码如下

import pandas as pd

a = pd.DataFrame()
date = [1,3,5]
score = [2,4,6]
a['date'] = date
a['score'] = score
print(a)

运行结果

   date  score
0     1      2
1     3      4
2     5      6

2、通过字典创建

默认以字典的键名作为列索引,演示代码如下:

import pandas as pd

a = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]},index=['x','y','z'])
print(a)

运行结果

   a  b
x  1  4
y  2  5
z  3  6

如果想以字典的键名作为行索引,可以用 from_dict()函数将字典转换成DataFrame,同时。设置参数orient的值为’index’。演示代码如下:

import pandas as pd

a = pd.DataFrame.from_dict({'a':[1,2,3],'b':[4,5,6]},orient='index')
print(a)

参数orient用于指定以字典的键名作为列索引还是行索引,默认值为 ‘columns 即以字典的键名作为列索引,如果设置成Index,则表示以字典的键名作为行索引。运行结果如下:

   0  1  2
a  1  2  3
b  4  5  6

3、通过二维数组创建

import pandas as pd
import numpy as np

a = np.arange(12).reshape(3,4)
b = pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D'])
print(b)

运行结果

   A  B   C   D
1  0  1   2   3
2  4  5   6   7
3  8  9  10  11

DataFrame 索引的修改

重命名索引

import pandas as pd
import numpy as np

a = np.arange(12).reshape(3,4)
b = pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D'])
b = b.rename(index={1:'万科',2:'阿里',3:'百度'},columns ={'A':1,'B':2,'C':3,'D':4})
print(b)

运行结果

    1  2   3   4
万科  0  1   2   3
阿里  4  5   6   7
百度  8  9  10  11

需要注意的是,rename()函数会用新索引名创建一个新的DataFrame,并不会改变b的内容.所以这里将重命名索引之后得到的新DataFrame赋给b,以便在后续代码中使用。也可以通过设置参数inplace为True来一步到位地完成索引的重命名,代码如下:

b.rename(index={1:'万科',2:'阿里',3:'百度'},columns ={'A':1,'B':2,'C':3,'D':4},inplace = True)

(三)、文件的读取和写入

文件的读取

以下代码读取名为”data.xlsx”的工作簿中的数据。

import pandas as pd
data = pd.read_excel('data.xlsx')

第2行代码中为read excel(以函数设置的文件路径参数是相对路径,即代码文件所在的路径,也可以设置成绝对路径。read-exce!(3蚤数还有其他参数,这里简单介绍几个常用参数:

  • sheetname用于指定工作表,可以是工作表名称,也可以是数字(默认为0,即第1个工作表)。
  • encoding用于指定文件的编码方式,一般设置为UTF-8或GBK编码,以避免中文乱码。
  • indexLcol用于设置索引列。

例如,要以 UTF−8 编码方式读取工作簿”data xlvx”的第1个工作表,则可将第2行代码修改为如下代码:

data = pd.read_excel('data.xlsx',sheetname=0,encoding='utf-8')

文件的写入

import pandas as pd
import numpy as np

a = np.arange(12).reshape(3,4)
b = pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D'])
b.to_excel('data.xlsx')

如果无法运行:即可安装 openpyxl

运行结果

数据导入和整理模块---pandas
上图中,行索引信息被存储在工作表的第1列中,如果想在写入数据时不保留行索引信息,可以设置to _ excel()函数的参数。该函数的常用参数有:
  • sheetname用于指定工作表名称。
  • index用于指定是否写入行索引信息,默认为True,即将行索引信息存储在输出文件的第1列:若设置为False,则忽略行索引信息。
  • columns用于指定要写入的列。
  • encoding用于指定编码方式。

例如,要将data中的A列数据写入工作簿并忽略行索引信息,可编写如下代码:

(四)、数据的选取和处理

先创建一个数据

import pandas as pd
import numpy as np
import  xlwings as xw

data = pd.DataFrame(np.arange(1,10).reshape(3,3),index=['r1','r2','r3'],columns=['c1','c2','c3'])

1、数据的选取

按列选取数据

选取单列

a = data['c1']
print(a)

运行结果

r1    1
r2    4
r3    7
Name: c1, dtype: int32

看到打印的数据没有列索引,可以使用如下代码

a = data[['c1']]
print(a)

选取多列

c = data[['c1','c2']]

按行选取数据

可以根据行序号来选取


a = data[1:3]
print(a)

运行结果

    c1  c2  c3
r2   4   5   6
r3   7   8   9

不过按上面的方式可能会产生混乱,可以使用 iloc方法


a = data.iloc[1:3]
print(a)

如果要选取单行就只能用 iloc方法,如选取倒数第一行

a = data.iloc[-1]
print(a)

还可以使用 loc 方法根据行的名称来选取数据

a = data.loc[['r2','r3']]
print(a)

运行结果

    c1  c2  c3
r2   4   5   6
r3   7   8   9

如果行数多可以使用 head()函数 来选取前几行数据


a = data.head(1)
print(a)

按区块选取数据

  1. 选取某几行的某几列数据

a = data[['c1','c3']][0:2]

print(a)
  1. 通常先用 ilon 方法选取行,再选取列
a = data.iloc[0:2][['c1','c3']]
print(a)
  1. 也可以使用 ilonlon 同时选取行和列
a = data.iloc[0:2,[0,2]]
print(a)

a = data.loc[['r1','r2'],['c1','c3']]
print(a)

2、数据的筛选

通过在中括号里设定条件可以过滤行。
如,筛选c1列大于1的行

a = data[data['c1']>1]
print(a)

运行结果

    c1  c2  c3
r2   4   5   6
r3   7   8   9

如果有多个筛选条件,可以用’&’或’|’连接起来。 注意用小括号将条件括起来

a = data[(data['c1']>1)&(data['c2'] == 5)]
print(a)

运行结果

    c1  c2  c3
r2   4   5   6

3、数据的排序

按列排序 sort_values()函数

例如,将data 按c2列进行降序排列。

a = data.sort_values(by='c2',ascending = False)
print(a)

运行结果

    c1  c2  c3
r3   7   8   9
r2   4   5   6
r1   1   2   3

参数by用于指定那一列来排序;参数ascending (上升的意思)默认值为True,表示升序排序,设置为False,表示降序排列。

按行进行排序 sort_index()函数

在上排序的基础上,加上

a = a.sort_index()
print(a)

运行结果

    c1  c2  c3
r1   1   2   3
r2   4   5   6
r3   7   8   9

4、数据的运算

通过数据运算可以基于已有的列生成新的一列

data = pd.DataFrame(np.arange(1,10).reshape(3,3),index=['r1','r2','r3'],columns=['c1','c2','c3'])
data['c4'] = data['c2'] + data['c3']
print(data)

运行结果

    c1  c2  c3  c4
r1   1   2   3   5
r2   4   5   6  11
r3   7   8   9  17

5、数据的删除

使用 drop()函数,该函数有以下参数

  • index:用于指定删除的行
  • columns:用于指定删除的列
  • inplace:默认值为False,表示不改变原来的,而是返回一个执行删除操作后返回的新表。

删除列

a = data.drop(columns = 'c1')
print(a)

a = data.drop(columns = ['c1','c3'])
print(a)

删除行


a = data.drop(index = ['r1','r3'])
print(a)

注意:给出行索引时要输入行索引名称而不是序号,除非行索引名就是数字

6、数据表的拼接

merge() 函数

merge()函数可以根据一个或多个同名的列将不同数据表中的行连接起来

import pandas as pd

df1 = pd.DataFrame({'公司':['恒诚','创越','快学'],'分数':[90,95,85]})
df2 = pd.DataFrame({'公司':['恒诚','创越','京西'],'股价':[20,180,30]})

df3 = pd.merge(df1,df2)
print(df3)

运行结果

   公司  分数   股价
0  恒诚  90   20
1  创越  95  180

可以看到,merge(函数直接根据相同的列名(“公司”列)对两个数据表进行了合并,而且默认选取的是两个表共有的列内容(恒盛’、’创锐)。如果同名的列不止一个,可以通过设置参数on指定按照哪一列进行合并,代码如下:

df3 = pd.merge(df1,df2,on ='公司')

默认的合并方式其实是取交集(inner连接》,即选取两个表共有的内容。如果想取并集(outer)连接),即选取两个表所有的内容,可以设置参数how,代码如下:

df3 = pd.merge(df1,df2,how = 'outer')
   公司    分数     股价
0  恒诚  90.0   20.0
1  创越  95.0  180.0
2  快学  85.0    NaN
3  京西   NaN   30.0

如果只要左边的全部内容,how参数为left,右边则是 right

想按行索引合并

df3 = pd.merge(df1,df2,left_index= True,right_index=True)
print(df3)

运行结果

  公司_x  分数 公司_y   股价
0   恒诚  90   恒诚   20
1   创越  95   创越  180
2   快学  85   京西   30

7、 concat() 函数

concat()函数使用全连接(UNIONALL)方式完成拼接,它不需要对齐,而是直接进行合并,即不需要两个表有相同的列或索引,只是把数据整合到一起。因此,该函数没有参数how和0n。而是用参数axis指定连接的轴向。

行方向拼接(纵向拼接)

df3 = pd.concat([df1,df2])

print(df3)

运行结果

   公司    分数     股价
0  恒诚  90.0    NaN
1  创越  95.0    NaN
2  快学  85.0    NaN
0  恒诚   NaN   20.0
1  创越   NaN  180.0
2  京西   NaN   30.0

我们发现索引还是原来的,我们可以设置 ignore_index为True来忽略原有的索引。

df3 = pd.concat([df1,df2],ignore_index = True)

横向拼接

df3 = pd.concat([df1,df2],axis = 1)

数据导入和整理模块---pandas

Original: https://blog.csdn.net/qq_39838607/article/details/120080118
Author: 落春只在无意间
Title: 数据导入和整理模块—pandas

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/678215/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球