Python数据分析(2)-pandas数据结构操作

pandas是一个提供快速、灵活、表达力强的数据结构的Python库,适合处理‘有关系’或者‘有标签’的数据。在利用Python做数据分析的时候,pandas是一个强有力的工具。 pandas库有两种数据结构,Series和DataFrame。前者适合处理一维数据,也就是单变量;后者适合分析多维数据,不过也仅仅只能是二维。在掌握DataFrame的操作后,自然也就熟悉了Series的操作,因而不描述如何操作Series。

1. DataFrame数据结构

DataFrame十分类似于Excel数据表,列以index索引,行以columns进行索引,这样(index,columns)能定位任意一个数据。构建原型为:class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False) 参数说明:

参数名称

说明

data

字典或者二维矩阵。如果是字典,则字典的keys默认为dataframe的columns

index

列表,如果不指定则默认产生np.arange(n)

columns

列表,如果不指定则默认产生np.arange(n)

dtype

数据类型

copy

是否从输入复制

创建一个dataframe:

import numpy as np
import pandas as pd
np.random.seed(1234) #种随机种子,保证每次产生的随机数一样
values = np.random.randint(1, 20, (10,10)) #100个数据,10行10列
index = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
columns = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']
df = pd.DataFrame(values, index=index, columns=columns, dtype=float)
print(df)
  out:
    one   two  three  four  five   six  seven  eight  nine   ten
a  16.0   7.0   13.0  16.0  18.0  10.0   12.0   13.0  17.0   6.0
b  17.0  10.0   16.0  19.0  17.0  13.0    6.0    3.0   7.0   4.0
c   8.0  12.0    1.0  10.0  12.0  17.0    4.0    3.0  13.0   2.0
d  12.0  12.0   18.0  15.0   8.0  11.0   12.0   15.0  18.0  14.0
e   1.0  13.0    6.0  18.0   6.0  14.0   17.0   10.0   9.0  13.0
f   7.0  13.0   16.0  18.0  19.0  15.0    3.0    6.0  14.0   7.0
g   8.0   5.0    4.0   6.0  15.0  16.0   16.0   16.0   3.0  11.0
h   5.0  19.0    8.0  12.0  15.0  19.0   10.0    1.0   3.0   2.0
i  19.0  18.0    8.0   5.0   8.0  18.0    1.0   10.0  19.0  10.0
j   2.0  15.0    4.0  13.0  10.0  14.0    1.0    5.0   5.0   1.0

查看数据基本信息:

print(df.index)
print(df.columns)
print(df.values)
out:
Index(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], dtype='object')
Index(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine','ten'],dtype='object')
[[ 16.   7.  13.  16.  18.  10.  12.  13.  17.   6.]
 [ 17.  10.  16.  19.  17.  13.   6.   3.   7.   4.]
 [  8.  12.   1.  10.  12.  17.   4.   3.  13.   2.]
 [ 12.  12.  18.  15.   8.  11.  12.  15.  18.  14.]
 [  1.  13.   6.  18.   6.  14.  17.  10.   9.  13.]
 [  7.  13.  16.  18.  19.  15.   3.   6.  14.   7.]
 [  8.   5.   4.   6.  15.  16.  16.  16.   3.  11.]
 [  5.  19.   8.  12.  15.  19.  10.   1.   3.   2.]
 [ 19.  18.   8.   5.   8.  18.   1.  10.  19.  10.]
 [  2.  15.   4.  13.  10.  14.   1.   5.   5.   1.]]

2. DataFrame操作

在写程序的时候,涉及到对对象的操作无外乎一下几种:增、删、查、改

2.1 查看数据(索引数据)

DataFrame最常用的索引数据的方法是.loc[index,columns],或者是.iloc[numbers, numbers]。可以看出loc是靠索引值来索引,iloc靠数据在矩阵中的位置标号来索引(位置标号从0开始),例如:

df.loc['b', 'two'] 和 df.iloc[1,1]  对应同一数:8 

索引多个数据时:

ind = ['b', 'c']
col = ['four', 'six', 'two']
print(df.loc[ind, col])
out:
   four   six   two
b  19.0  13.0  10.0
c  10.0  17.0  12.0

特别的,以columns索引数据时还有其他方法:

df[['three','five']]

通过条件索引:

df[df>5]

out:
    one   two  three  four  five   six  seven  eight  nine   ten
a  16.0   7.0   13.0  16.0  18.0  10.0   12.0   13.0  17.0   6.0
b  17.0  10.0   16.0  19.0  17.0  13.0    6.0    NaN   7.0   NaN
c   8.0  12.0    NaN  10.0  12.0  17.0    NaN    NaN  13.0   NaN
d  12.0  12.0   18.0  15.0   8.0  11.0   12.0   15.0  18.0  14.0
e   NaN  13.0    6.0  18.0   6.0  14.0   17.0   10.0   9.0  13.0
f   7.0  13.0   16.0  18.0  19.0  15.0    NaN    6.0  14.0   7.0
g   8.0   NaN    NaN   6.0  15.0  16.0   16.0   16.0   NaN  11.0
h   NaN  19.0    8.0  12.0  15.0  19.0   10.0    NaN   NaN   NaN
i  19.0  18.0    8.0   NaN   8.0  18.0    NaN   10.0  19.0  10.0
j   NaN  15.0    NaN  13.0  10.0  14.0    NaN    NaN   NaN   NaN

从例子中发现,当条件为真时,保留数据,条件为假,该处数据被改为nan,即为缺省值

2.2 增加数据

增加数据涉及到增加行,增加列,以及多个dataframe合并 2.2.1 增加行:append

ind1 = ['a', 'b']
col1 = ['one', 'three', 'two']
df1 = df.loc[ind1, col1]
s = df.loc['f']
df1 = df1.append(s)
print(df1)
    one  three   two  eight  five  four  nine  seven   six  ten
a  16.0   13.0   7.0    NaN   NaN   NaN   NaN    NaN   NaN  NaN
b  17.0   16.0  10.0    NaN   NaN   NaN   NaN    NaN   NaN  NaN
f   7.0   16.0  13.0    6.0  19.0  18.0  14.0    3.0  15.0  7.0

发现默认会增加原来数据的列。其实就相当于合并了两个dataframe,取了并集。所以在增加行的时候需要保证列能够参数对齐。

2.2.2 增加列 增加列数据比较容易,直接赋值就好:

ind1 = ['a', 'b']
col1 = ['one', 'three', 'two']
df1 = df.loc[ind1, col1]
df1['four'] = [1, 2]
print(df1)
    one  three   two  four
a  16.0   13.0   7.0     1
b  17.0   16.0  10.0     2

2.2.3 dataframe合并:concat concat是用的最多的合并方法,原型是:

pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

重要参数:

参数名称

参数说明

obj

需要合并的对象,一般为[df1,df2,…dfn]

axis

合并方向,0为按照index合并,即从下面添加;1为按照columns合并,即从右边添加

join

合并方式。{‘inner’, ‘outer’}可选,inner为取并集,outer为取交集

按照columns合并,取并集:axis=1, join=’outer’

ind1 = ['a', 'b']
col1 = ['one', 'three', 'two']
df1 = df.loc[ind1, col1]
df1_col = df.loc[ind1 + ['c'], ['four']]
df1_row = df.loc[['c'], col1]
print(pd.concat([df1, df1_col], axis=1, join='outer'))
    one  three   two  four
a  16.0   13.0   7.0  16.0
b  17.0   16.0  10.0  19.0
c   NaN    NaN   NaN  10.0

将代码修改为:join=’inner’

print(pd.concat([df1, df1_col], axis=1, join='inner'))
    one  three   two  four
a  16.0   13.0   7.0  16.0
b  17.0   16.0  10.0  19.0

按照row合并,取交集:

ind1 = ['a', 'b']
col1 = ['one', 'three', 'two']
df1 = df.loc[ind1, col1]
df1_row = df.loc[['c'], col1+['five']]
print(pd.concat([df1, df1_row], axis=0, join='inner'))
    one  three   two
a  16.0   13.0   7.0
b  17.0   16.0  10.0
c   8.0    1.0  12.0

2.3 修改数据

修改数据特别简单,直接赋值即可: df.loc[index, columns] = values

2.4 删除数据

2.4.1 删除columns:pop

df = pd.DataFrame(values, index=index, columns=columns, dtype=float)
ind1 = ['a', 'b']
col1 = ['one', 'three', 'two']
df1 = df.loc[ind1, col1]
df1.pop('one')
print(df1)
   three   two
a   13.0   7.0
b   16.0  10.0

删除columns用pop很好理解,因为columns和数据的关系本来就是字典中的keys和values的关系,字典中删除keys用的就是pop 删除列不止这一种方法,还可以用drop:

ind1 = ['a', 'b']
col1 = ['one', 'three', 'two']
df1 = df.loc[ind1, col1]
df1 = df1.drop('one', axis=1)
print(df1)
   three   two
a   13.0   7.0
b   16.0  10.0

drop和pop的区别是:pop改变原数据,drop不改变原数据。pop只用于删除列,drop可以用来删除行和列(axis参数控制) 2.4.2 删除index:

当drop中的axis参数为0时,即删除行:

ind1 = ['a', 'b']
col1 = ['one', 'three', 'two']
df1 = df.loc[ind1, col1]
df1 = df1.drop('a', axis=0)
print(df1)
    one  three   two
b  17.0   16.0  10.0

3. 缺省值处理

dataframe中没有数据或者数据为nan(非数字)时,都用nan表示。

values = [[1, 2, 3], ['jj', np.nan, 8], [np.inf, np.nan, 5]]
index = ['a', 'b', 'c']
columns = ['one', 'two', 'three']

df = pd.DataFrame(values, index=index, columns=columns)
print(df)
   one  two  three
a    1  2.0      3
b   jj  NaN      8
c  inf  NaN      5

对于缺省值的处理有: 判断是否为缺省值:isnull

print(df.isnull())
     one    two  three
a  False  False  False
b  False   True  False
c  False   True  False

缺省值的填充:fillna

df = df.fillna(value=6)
   one  two  three
a    1  2.0    3.0
b   jj  6.0    8.0
c  inf  6.0    5.0

4. 统计学指标计算

包含的统计学指标计算API有:

函数名

功能

说明

describe

简单指标计算

按col计算常用简单指标,例如均值等

mean

均值

与axis有关

cov

协方差

包括nan

count()

col中非nan的数据个数

None

sum()

求和

None

median()

中位数

None

min()

最小值

None

max()

最大值

None

std()

标准差

None

var()

方差

None

skew()

样本偏度

None

kurt()

样本峰度

None

quantile()

样本分位数

None

corr()

相关系数

三种方法

import numpy as np
import pandas as pd
np.random.seed(1234)
values = np.random.randint(1, 10, (5, 5))
columns = ['col'+str(n) for n in np.arange(len(values))]
index = ['index'+str(n) for n in np.arange(len(values))]

df = pd.DataFrame(values, index=index, columns=columns)

# 常用的统计学指标计算:describe
stat = df.describe()
print(stat)
           col0      col1     col2     col3      col4
count  5.000000  5.000000  5.00000  5.00000  5.000000
mean   3.800000  4.000000  6.20000  4.80000  4.600000
std    2.280351  3.316625  1.30384  2.48998  3.781534
min    1.000000  1.000000  4.00000  3.00000  1.000000
25%    2.000000  1.000000  6.00000  3.00000  1.000000
50%    4.000000  3.000000  7.00000  4.00000  4.000000
75%    6.000000  7.000000  7.00000  5.00000  8.000000
max    6.000000  8.000000  7.00000  9.00000  9.000000

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据科学与人工智能

【Python环境】Python中的结构化数据分析利器-Pandas简介

Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Pyt...

26910
来自专栏PaddlePaddle

【进阶篇】C-API 使用流程

编写|PaddlePaddle 排版|wangp 这篇推文介绍 PaddlePaddle C-API 整体使用流程 1 使用流程 使用 C-API 的工作流...

2803
来自专栏瓜大三哥

基于FPGA的均值滤波(三)

基于FPGA的均值滤波(三) 之二维求和模块 在实现了窗口内一维行方向上的求和操作,现在要得到整个窗口内的像素之和,还必须将每一行的计算结果再叠加起来。但是每一...

1889
来自专栏机器之心

资源 | 23种Pandas核心操作,你需要过一遍吗?

Pandas 是基于 NumPy 构建的库,在数据处理方面可以把它理解为 NumPy 加强版,同时 Pandas 也是一项开源项目。它基于 Cython,因此读...

712
来自专栏BestSDK

Pytorch 0.3.0 发布:新增张量函数,支持模型移植

根据官方文档的介绍,此次增加了多个函数和功能,多方面的性能均实现提升。 重大变更 0.3 版本中删掉了 Variable.reinforce() 等随机函数,因...

3418
来自专栏人工智能LeadAI

Python数据分析模块 | pandas做数据分析(二):常用预处理操作

在数据分析和机器学习的一些任务里面,对于数据集的某些列或者行丢弃,以及数据集之间的合并操作是非常常见的. 1、合并操作 pandas.merge pandas....

3496
来自专栏菩提树下的杨过

NDArray自动求导

NDArray可以很方便的求解导数,比如下面的例子:(代码主要参考自https://zh.gluon.ai/chapter_crashcourse/autogr...

18510
来自专栏企鹅号快讯

动态神经网络工具包Dynet

作者|Murat 译者|陈亮芬 编辑|Emily 基于诸如 TensorFlow 等几种流行工具包的编程模型使用的是静态声明方法,这些工具包将网络架构的声明和执...

2387
来自专栏王小雷

Python之Pandas中Series、DataFrame实践

Python之Pandas中Series、DataFrame实践 1. pandas的数据结构Series 1.1 Series是一种类似于一维数组的对象,它由...

1905
来自专栏逍遥剑客的游戏开发

VR中对带有约束的物理对象的交互

2526

扫码关注云+社区