Pandas

Pandas 是基于 NumPy 的一个开源 Python 库,可以把 Pandas 看作是 Python 版的 Excel。pandas是专门为处理表格和混杂数据设计的,而NumPy更适合处理统一的数值数组数据。

一. 数据结构

pandas有两个主要数据结构:Series和DataFrame。

Series

Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成,即index和values两部分,可以通过索引的方式选取Series中的单个或一组值。

Series的创建

**pd.Series(list,index=[ ])**,第二个参数是Series中数据的索引,可以省略。

  • 第一个参数可以是列表
import numpy as np, pandas as pd
arr1 = np.arange(3)
s1 = pd.Series(arr1)
print(s1) #由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引
0 0
1 1
2 2
  • 第一个参数可以是字典,字典的键将作为Series的索引
  • 第一个参数可以是DataFrame中的某一行或某一列

Series类型的操作

Series类型索引、切片、运算的操作类似于ndarray,同样的类似Python字典类型的操作,包括保留字in操作、使用.get()方法。
Series和ndarray之间的主要区别在于Series之间的操作会根据索引自动对齐数据。

DataFrame

DataFrame是一个表格型的数据类型,每列值类型可以不同,是最常用的pandas对象。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。

DataFrame的创建

**pd.DataFrame(data,columns = [ ],index = [ ])**:columns和index为指定的列、行索引,并按照顺序排列。

  • 创建DataFrame最常用的是直接传入一个由等长列表或NumPy数组组成的字典,会自动加上行索引,字典的会被当做列索引
import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
df= pd.DataFrame(data)
In [45]: df
Out[45]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
5 3.2 Nevada 2003

如果创建时指定了columns和index索引,则按照索引顺序排列,并且如果传入的列在数据中找不到,就会在结果中产生缺失值:

In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
....: index=['one', 'two', 'three', 'four', 'five', 'six'])
In [49]: df2
Out[49]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
six 2003 Nevada 3.2 NaN

另一种常见的创建DataFrame方式是使用嵌套字典,如果嵌套字典传给DataFrame,pandas就会被解释为外层字典的键作为列,内层字典键则作为行索引

In [65]: pop = {'Nevada': {2001: 2.4, 2002: 2.9},
....: 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [66]: df3 = pd.DataFrame(pop)
In [67]: df3
Out[67]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6

DataFrame对象操作

df.values:将DataFrame转换为ndarray二维数组。

import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
....: index=['one', 'two', 'three', 'four', 'five', 'six'])

In [50]: df2.columns
Out[50]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
#通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。
In [51]: df2['state'] #或者df2.state
Out[51]:
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
six Nevada

列可以通过赋值的方式进行修改。例如,我们可以给那个空的”debt”列赋上一个标量值或一组值

In [54]: frame2['debt'] = 16.5
In [55]: frame2
Out[55]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
six 2003 Nevada 3.2 16.5

将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值

In [58]: val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
In [59]: df2['debt'] = val
In [60]: df2
Out[60]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
six 2003 Nevada 3.2 16.5

创建列并赋值

#为不存在的列赋值,会创建出一个新列
In [61]: df2['eastern'] = df2.state == 'Ohio'
In [62]: df2
Out[62]:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
six 2003 Nevada 3.2 NaN False
#关键字del用于删除列
In [63]: del df2['eastern']
In [64]: df2.columns
Out[64]: Index(['year', 'state', 'pop', 'debt'], dtype='object')

二. 应用示例

1,将列表转换成pandas数据类型DataFrame

import pandas as pd

students = [("小明", 10, "男"), ("小红", 11, "女")]
df = pd.DataFrame(students, columns=["姓名", "年龄", "性别"])
print(df)
# 输出
姓名 年龄 性别
0 小明 10
1 小红 11

2,读取CSV文件换成pandas数据类型DataFrame

import pandas as pd

df = pd.read_csv("./test.csv") #默认utf-8编码也可以指定编码格式encoding='gbk'
print(df)
# 输出
姓名 年龄 性别
0 小明 18
1 小红 18

3,查看行数和列数

import pandas as pd

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
print(df.shape)
# 输出
(3,3)

4,查看列名

import pandas as pd

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
print(df.columns)
# 输出
Index(['A', 'B', 'C'], dtype='object')

5,查看索引

import pandas as pd

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
print(df.index)
# 输出
RangeIndex(start=0, stop=3, step=1)

6,查看数据

#查看前三行
df.head(3)
#查看后三行
df.tail(3)

7,查看pandas数据类型

df.dtypes

8,查看数据摘要信息

import pandas as pd

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
print(df.describe())
# 输出
A B C
count 3.0 3.0 3.0
mean 2.0 5.0 8.0
std 1.0 1.0 1.0
min 1.0 4.0 7.0
25% 1.5 4.5 7.5
50% 2.0 5.0 8.0
75% 2.5 5.5 8.5
max 3.0 6.0 9.0

9,查看行和列

import pandas as pd

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
l0 = df.loc[01] # 查看0,1行
print(l0)
# 输出
A B C
0 1 4 7
1 2 5 8
# 只查看前两行 AB列
l1 = df.loc[[0, 1], ["A", "B"]]
print(l1)
# 输出
A B
0 1 4
1 2 5

查看列

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
#查看A列
l2 = df[["A"]]
print(l2)
# 输出
A
0 1
1 2
2 3
#查看AB列
l2 = df[["A","B"]]
print(l2)
#输出
A B
0 1 4
1 2 5
2 3 6
# 使用iloc 查看列":"是行数 1:2是列范围,获取1-3列的第一行
l1 = df.iloc[0:1,1:3]
#输出
B C
0 4 7

10,筛选行

import pandas as pd

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
# A列中大于1
data = df["A"] > 1
print(df[data])
#输出
A B C
1 2 5 8
2 3 6 9

11,筛选列