小言_互联网的博客

一篇文章让你快速入门Pandas

466人阅读  评论(0)

Pandas介绍

我将在下面简单介绍Pandas,详细信息可以看官方文档Pandas中文官方文档

简单介绍

pandas是python的核心数据分析支持,提供了快速、灵活、明确的数据结构,旨在简单直观地处理关系型和标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,Pandas 离这个目标已经越来越近了。

Pandas的基本功能

Pandas适用于处理以下类型的数据:
1.与 SQL 或 Excel 表类似的,含异构列的表格数据;
2.有序和无序(非固定频率)的时间序列数据;
3.带行列标签的矩阵数据,包括同构或异构型数据;
4.任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。
pandas的主要数据结构是Series(一维数据)和DataFrame(二维数据),Pandas 基于 NumPy (opens new window)开发,可以与其它第三方科学计算支持库完美集成。

Pandas的优势

Pandas比较与其他的数据处理有很多优势,下面列出部分优势:
1.处理浮点与非浮点数据里的缺失数据,表示为 NaN;
2.大小可变:插入或删除 DataFrame 等多维对象的列;
3.自动、显式数据对齐:显式地将对象与一组标签对齐,也可以忽略标签,在 Series、DataFrame 计算时自动与数据对齐;
4.强大、灵活的分组(group by)功能:拆分-应用-组合数据集,聚合、转换数据;
5.把 Python 和 NumPy 数据结构里不规则、不同索引的数据轻松地转换为 DataFrame 对象;
6.基于智能标签,对大型数据集进行切片、花式索引、子集分解等操作;
7.直观地合并(merge)、连接(join)数据集;
8.灵活地重塑(reshape)、透视(pivot)数据集;
9.轴支持结构化标签:一个刻度支持多个标签;
10.成熟的 IO 工具:读取文本文件(CSV 等支持分隔符的文件)、Excel 文件、数据库等来源的数据,利用超快的 HDF5 格式保存 / 加载数据;
11.时间序列:支持日期范围生成、频率转换、移动窗口统计、移动窗口线性回归、日期位移等时间序列功能。

数据结构

Series 带标签的一维同构数组
DataFrame 带标签的,大小可变的,二维异构表格

为什么有多个数据结构

Pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。处理 DataFrame 等表格数据时,index(行)或 columns(列)比 axis 0 和 axis 1 更直观。用这种方式迭代 DataFrame 的列,代码更易读易懂

大小可变与数据复制

Pandas 所有数据结构的值都是可变的,但数据结构的大小并非都是可变的,比如,Series 的长度不可改变,但 DataFrame 里就可以插入列。
Pandas 里,绝大多数方法都不改变原始的输入数据,而是复制数据,生成新的对象。 一般来说,原始输入数据不变更稳妥。

Pandas的基本内容

Pandas的基础方法

数据的生成与有关方法

一维数组

# 生成一个Series类型的一维数组
a = pd.Series([1, 2, 3, np.nan, 44, 1])
print(a)

0     1.0
1     2.0
2     3.0
3     NaN
4    44.0
5     1.0
dtype: float64

二维数组

dates = pd.date_range('20200127', periods=6)
print(dates)
'''第一个参数是数据,第二个参数是行,第三个是列,
详情可以用print(help(pd.DataFrame))查看'''
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
print(df)

DatetimeIndex(['2020-01-27', '2020-01-28', '2020-01-29', '2020-01-30',
               '2020-01-31', '2020-02-01'],
              dtype='datetime64[ns]', freq='D')
                   a         b         c         d
2020-01-27  0.292798 -0.217713 -0.535531 -0.113389
2020-01-28  0.811442 -0.761526 -1.245899 -0.083227
2020-01-29  1.445080  2.055359 -1.355587  0.148992
2020-01-30 -0.486965  0.151710  0.574553  0.371862
2020-01-31  1.840392  1.384281  0.580354  2.058363
2020-02-01  0.704466 -0.469254 -0.010766  0.395096
# 指定矩阵直接转换成二维数组
df1 = pd.DataFrame(np.arange(12).reshape((3, 4)))
print(df1)
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
# 利用字典的方法进行生成
df2 = pd.DataFrame({
   'A':1, 'B':pd.Timestamp('20210127'), 'C':np.array([3]*4)})
print(df2)
   A          B  C
0  1 2021-01-27  3
1  1 2021-01-27  3
2  1 2021-01-27  3
3  1 2021-01-27  3

数组的其余方法

print(df2.dtypes)#打印行列的类型
print(df2.columns)#打印行列的序号
print(df2.values)#打印他们的数据
print(df2.describe())#打印数字的平均值,最大值,最小值
print(df2.T)#转置
print(df2.sort_index(axis=1,ascending=False))#对列排序,倒序(True正序),排序只是对序号
print(df2.sort_values(by='A'))#对值排序,对A,如果不加括号就是所有排序

Pandas的选择数据

import pandas as pd
import numpy as np
dates = pd.date_range('20210127', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['a', 'b', 'c', 'd'])

Pandas支持利用标签对数据进行选择,同时也支持切牌你对数据进行操作

用标签选取数据

# 打印a标签的所有数值
print(df['a'], df.a)

2021-01-27     0
2021-01-28     4
2021-01-29     8
2021-01-30    12
2021-01-31    16
2021-02-01    20
Freq: D, Name: a, dtype: int32 2021-01-27     0

切片

print(df[0:3], df['20210127':'20210129'])#切片
            a  b   c   d
2021-01-27  0  1   2   3
2021-01-28  4  5   6   7
2021-01-29  8  9  10  11             a  b   c   d
2021-01-27  0  1   2   3
2021-01-28  4  5   6   7
2021-01-29  8  9  10  11
print(df.loc['20210128'])#进行选取
a    4
b    5
c    6
d    7
Name: 2021-01-28 00:00:00, dtype: int32        
print(df.loc[:, ['a', 'b']])# 打印所有行和a, b 两列
             a   b
2021-01-27   0   1
2021-01-28   4   5
2021-01-29   8   9
2021-01-30  12  13
2021-01-31  16  17
2021-02-01  20  21

利用iloc进行选择

print(df.iloc[3, 1])#利用索引进行选取
print(df.iloc[2:5, 1:3])#切片
print(df.iloc[[1, 3, 5], 1:3])# 索引加切片

Boolean indexing布尔索引

print(df[df.a>8])#打印所有数字大于8的那些行
             a   b   c   d
2021-01-30  12  13  14  15
2021-01-31  16  17  18  19
2021-02-01  20  21  22  23

Pandas的缺失值处理

在进行数据处理的过程中很容易遇到空值,对于空值我们也有相应的做法

import pandas as pd
import numpy as np
dates = pd.date_range('20200302', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns = list("ABCD"))

我们先定义几个空值来示范

df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan

删除缺失值的行

print(df.dropna(axis=0, how='any'))

             A     B     C   D
2020-03-04   8   9.0  10.0  11
2020-03-05  12  13.0  14.0  15
2020-03-06  16  17.0  18.0  19
2020-03-07  20  21.0  22.0  23

填充缺失值

print(df.fillna(value=0))

             A     B     C   D
2020-03-02   0   0.0   2.0   3
2020-03-03   4   5.0   0.0   7
2020-03-04   8   9.0  10.0  11
2020-03-05  12  13.0  14.0  15
2020-03-06  16  17.0  18.0  19
2020-03-07  20  21.0  22.0  23

提取NAN值的布尔掩码

print(df.isnull())
print(np.any(df.isnull())==True)

                A      B      C      D
2020-03-02  False   True  False  False
2020-03-03  False  False   True  False
2020-03-04  False  False  False  False
2020-03-05  False  False  False  False
2020-03-06  False  False  False  False
2020-03-07  False  False  False  False
True

Pandas的运算

统计

一般情况下,运算时排除缺失值。

'''df.mean()等价于df.mean(0)。把轴向数据求平均,得到每列数据的平均值。
df.mean(1)按照另外一个axis的方向来求平均,得到每行数据的平均值。'''
df.mean()
df.mean(1)

不同维度对象运算时,要先对齐。

合并

concat合并

df0 = pd.DataFrame(np.ones((3, 4))*0, columns=list('abcd'),index=[1, 2, 3])
df1 = pd.DataFrame(np.ones((3, 4))*1, columns=list('abcd'),index=[2, 3, 4])
df2 = pd.DataFrame(np.ones((3, 4))*1, columns=list('abcd'))
# 以行的形式进行合并,如果列不够就忽视
res = pd.concat([df0,df1,df2],axis=0,ignore_index=True)

join合并

left = pd.DataFrame({
   'key': ['K0', 'K1', 'K2', 'K3'],
                             'A': ['A0', 'A1', 'A2', 'A3'],
                             'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({
   'key': ['K0', 'K1', 'K2', 'K3'],
                              'C': ['C0', 'C1', 'C2', 'C3'],
                              'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on='key')
# how = ['left', 'right', 'outer', 'inner']
res1 = pd.merge(left, right, on='key', how='inner')

append追加

 result = df1.append(df2)

Pandas数据的导入与导出

数据导入

pd.read_csv(filename):从CSV文件导入数据
pd.read_table(filename):从限定分隔符的文本文件导入数据
pd.read_excel(filename):从Excel文件导入数据
pd.read_sql(query, connection_object):从SQL表/库导入数据
pd.read_json(json_string):从JSON格式的字符串导入数据
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

数据导出

df.to_csv(filename):导出数据到CSV文件
df.to_excel(filename):导出数据到Excel文件
df.to_sql(table_name, connection_object):导出数据到SQL表
df.to_json(filename):以Json格式导出数据到文本文件

应用实例

import pandas as pd
#导入xlsx格式的数据文件
data=pd.read_excel('文件地址',sheetname='Sheet1')
 
#导入csv格式的数据文件
data=pd.read_csv('文件地址',sheetname='Sheet1')
 
#导入txt格式的数据文件,可能会涉及编码问题或者中文路径需要先用open函数打开连接,并进行转码
op=open('文件地址',encoding='utf-8')
data=pd.read_table(op)
 

Pandas数据的可视化

我们可以利用matplotlib进行数据的可视化,利用其中的个plot包进行出图

一维数据的可视化

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Series
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum()
data.plot()
plt.show()

二维数组的可视化

data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
data = data.cumsum()
print(data.head(3))
data.plot()
plt.show()
'''
plot methods:
'bar', 'hist','box','area','scatter','pie'
分别是柱状图,直方图,盒图,区域面积图,散点图,饼图
'''
ax = data.plot.scatter(x='A', y='B',color='DarkBlue', label="Class 1")
data.plot.scatter(x='A', y='C',color='DarkGreen', label="Class 2",ax=ax)
plt.show()


转载:https://blog.csdn.net/qq_51718832/article/details/115979572
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场