学习笔记,这个笔记以例子为主。
开发工具:Spyder



文章目录



数据框DateFrame

DataFrame是一个类似于表格的数据类型,可以理解为一个二维数组,索引有两个维度,可更改。

  • DataFrame的特点

①列可以是不同的类型
②大小可变
③标记轴(行和列)
④可以对行和列执行算术运算

  • 语法
import numpy as np
import pandas as pd

#创建一个空的DataFrame对象
df = pd.DataFrame()

#从列表创建DataFrame
data = [['A', 9], ['B', 12], ['C', 15]]
df = pd.DataFrame(data)

#从字典创建DataFrame
data = [{'A':1, 'B':2},
{'A':3, 'B':4, 'C':5}]
df = pd.DataFrame(data)
  • 例子1(列表构造方式)

代码1:

import numpy as np
import pandas as pd

#从列表创建DataFrame
data = [['Ada', 9], ['Black', 12], ['Jack', 15]]
df = pd.DataFrame(data)
print(df)

结果1:

0   1
0 Ada 9
1 Black 12
2 Jack 15

代码2(设置列名):

data = [['Ada', 9], ['Black', 12], ['Jack', 15]]
df = pd.DataFrame(data, columns = ['name', 'age'])
print(df)
print('-'*10)
print(df.dtypes)

结果2:

name  age
0 Ada 9
1 Black 12
2 Jack 15
----------
name object
age int64
dtype: object

代码3(设置数据类型):

data = [['Ada', 9], ['Black', 12], ['Jack', 15]]
df = pd.DataFrame(data,
columns = ['name', 'age'],
dtype = float)
print(df)
print('-'*10)
print(df.dtypes)

结果3:

name   age
0 Ada 9.0
1 Black 12.0
2 Jack 15.0
----------
name object
age float64
dtype: object
  • 例子2(字典构造方式)

代码1:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15]}

df = pd.DataFrame(data)
print(df)

结果1:

age   name
0 9 Ada
1 19 Tom
2 12 Black
3 15 Jack

备注:字典无序,所以构成dataframe类型时,列会自动的按照列名的首字母排序

代码2(设置行名):

df = pd.DataFrame(data, 
index = ['A', 'B', 'C', 'D'])
print(df)

结果2:

age   name
A 9 Ada
B 19 Tom
C 12 Black
D 15 Jack

代码3:

df = pd.DataFrame(data, 
index = pd.date_range(
'2020-01-01', periods = 4))
print(df)

结果3:

age   name
2020-01-01 9 Ada
2020-01-02 19 Tom
2020-01-03 12 Black
2020-01-04 15 Jack
  • 例子3(字典的其他构造方式)

代码1:

import pandas as pd

data = [{'A':1, 'B':2},
{'A':3, 'B':4, 'C':5}]
df = pd.DataFrame(data)
print(df)

结果1:

A  B    C
0 1 2 NaN
1 3 4 5.0

代码2:

import pandas as pd

data = {'A':pd.Series([1, 2, 3], index = ['one', 'two', 'three']),
'B':pd.Series([1, 2, 3, 4], index = ['one', 'two', 'three', 'four'])}
df = pd.DataFrame(data)
print(df)

结果2:

A  B
four NaN 4
one 1.0 1
three 3.0 3
two 2.0 2

数据结构操作(举例)

列访问

DataFrame的单列数据为一个Series。根据DataFrame的定义可以知晓DataFrame是一个带有标签的二维数组,每个标签相当每一列的列名。

  • 例子

①访问单列

代码:

import pandas as pd

data = {'A':pd.Series([1, 2, 3], index = ['one', 'two', 'three']),
'B':pd.Series([1, 2, 3, 4], index = ['one', 'two', 'three', 'four']),
'C':pd.Series([6, 7, 8, 9], index = ['one', 'two', 'three', 'four'])}
df = pd.DataFrame(data)
#print('-'*10)
print(df['A'], '\n',type(df['A']))

结果:

four     NaN
one 1.0
three 3.0
two 2.0
Name: A, dtype: float64
<class 'pandas.core.series.Series'>

②访问多列

代码:

import pandas as pd

data = {'A':pd.Series([1, 2, 3], index = ['one', 'two', 'three']),
'B':pd.Series([1, 2, 3, 4], index = ['one', 'two', 'three', 'four']),
'C':pd.Series([6, 7, 8, 9], index = ['one', 'two', 'three', 'four'])}
df = pd.DataFrame(data)

print(df[['C', 'B']])

结果:

C  B
four 9 4
one 6 1
three 8 3
two 7 2

列添加

DataFrame添加一列的方法非常简单,只需要新建一个列索引。并对该索引下的数据进行赋值操作即可。

  • 例子

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15]}

df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])
df['weight'] = pd.Series([8, 4, 5, 6],
index = ['a1', 'a2', 'a3', 'a4'])

print(df)

结果:

age   name  weight
a1 9 Ada 8
a2 19 Tom 4
a3 12 Black 5
a4 15 Jack 6

列删除

删除某列数据需要用到pandas提供的方法pop()。

  • 例子

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}

df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])

print(df)
print('-'*20)

#del 方法,删除一列
del(df['weight'])
print(df)
print('-'*20)

#pop方法,删除一列
df.pop('hight')
print(df)

结果:

age  hight   name  weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
--------------------
age hight name
a1 9 20 Ada
a2 19 35 Tom
a3 12 30 Black
a4 15 33 Jack
--------------------
age name
a1 9 Ada
a2 19 Tom
a3 12 Black
a4 15 Jack

行访问

  • 例子1(切片​​:​​)

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}

df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])


print(df)
print('-'*20)
print(df[1:3])

结果:

age  hight   name  weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
--------------------
age hight name weight
a2 19 35 Tom 4
a3 12 30 Black 5
  • 例子2(​​loc​​方法)

loc方法是针对DataFrame索引名称的切片方法,在下面的例子中,我们演示一下loc方法的使用。

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}

df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])


print(df)
print('-'*20)
print(df.loc['a2'], '\n',type(df.loc['a2']))
print('-'*20)
print(df.loc[['a1', 'a3']])

结果:

age  hight   name  weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
--------------------
age 19
hight 35
name Tom
weight 4
Name: a2, dtype: object
<class 'pandas.core.series.Series'>
--------------------
age hight name weight
a1 9 20 Ada 8
a3 12 30 Black 5

备注:只获取一行,则拿到的是Series。

  • 例子3(​​iloc​​方法)

iloc方法和loc区别是iloc接受的必须是行索引和列索引的下标,在下面的例子中,我们演示一下loc方法的使用。

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}

df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])

print(df.iloc[2])
print('-'*20)
print(df.iloc[[1, 3]])

结果:

age          12
hight 30
name Black
weight 5
Name: a3, dtype: object
--------------------
age hight name weight
a2 19 35 Tom 4
a4 15 33 Jack 6

行添加

  • 例子

代码:

import pandas as pd

df1 = pd.DataFrame([['Huang', 7], ['Bai', 8]],
columns = ['name', 'age'])

df2 = pd.DataFrame([['Bunny', 5], ['Tim', 9]],
columns = ['name', 'age'])

print(df1)
print('-'*15)
df = df1.append(df2)
print(df)
print('-'*15)
print(df.loc[0])

结果:

name  age
0 Huang 7
1 Bai 8
---------------
name age
0 Huang 7
1 Bai 8
0 Bunny 5
1 Tim 9
---------------
name age
0 Huang 7
0 Bunny 5

由结果可知,进行行添加后,行标会出现重复的状况,如果按照行标进行行查询,则可能会找到多行数据。我们可以重建索引,解决索引重复问题。

行删除

使用索引标签从DataFrame中删除或者删除行。如果标签重复,则会删除多行。

  • 例子

代码:

import pandas as pd

df1 = pd.DataFrame([['Huang', 7], ['Bai', 8]],
columns = ['name', 'age'])

df2 = pd.DataFrame([['Bunny', 5], ['Tim', 9]],
columns = ['name', 'age'])


df = df1.append(df2)
print(df)
print('-'*15)
#删除index为1的行
df = df.drop(1)
print(df)

结果:

name  age
0 Huang 7
1 Bai 8
0 Bunny 5
1 Tim 9
---------------
name age
0 Huang 7
0 Bunny 5

修改DataFrame中的数据

更改DataFrame中的数据,原理是将要修改的这部分数据提取出来,重新赋值为新的数据.

  • 例子

代码:

import pandas as pd

df = pd.DataFrame([['Huang', 7], ['Bai', 8],
['Black', 9]],
columns = ['name', 'age'])

print(df)
print('-'*15)

df['name'][2] = 'Tim'
print(df)

备注:​​df["Name"][2]​​是先拿到name列(Series类型),再拿到第3行。

结果:

name  age
0 Huang 7
1 Bai 8
2 Black 9
---------------
name age
0 Huang 7
1 Bai 8
2 Tim 9

DataFrame常用属性

编号

属性或方法

描述

1

​axes​

返回 行/列 标签(index)列表。

2

​dtype​

返回对象的数据类型(​​dtype​​)。

3

​empty​

如果Series为空,则返回​​True​​。

4

​ndim​

返回底层数据的维数,默认定义:​​1​​。

5

​size​

返回基础数据中的元素数。

6

​values​

将系列作为​​ndarray​​返回。

7

​head()​

返回前​​n​​行。

8

​tail()​

返回最后​​n​​行。

  • 例子

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack'],
'age':[9, 19, 12, 15],
'weight':[8, 4, 5, 6],
'hight':[20, 35, 30, 33]}

df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4'])

print(df, '\n')
print(df.axes, '\n')
print(df['age'].dtype, '\n')
print(df.empty, '\n')
print(df.ndim, '\n')
print(df.size, '\n')
print(df.values, '\n')
print(df.head(3), '\n') # df的前三行
print(df.tail(3), '\n') # df的后三行

结果:

age  hight   name  weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6

[Index(['a1', 'a2', 'a3', 'a4'], dtype='object'), Index(['age', 'hight', 'name', 'weight'], dtype='object')]

int64

False

2

16

[[9 20 'Ada' 8]
[19 35 'Tom' 4]
[12 30 'Black' 5]
[15 33 'Jack' 6]]

age hight name weight
a1 9 20 Ada 8
a2 19 35 Tom 4
a3 12 30 Black 5

age hight name weight
a2 19 35 Tom 4
a3 12 30 Black 5
a4 15 33 Jack 6
  • 例子2(describe)

代码1:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack', 'Bai'],
'age':[9, 19, 12, 15, 10],
'weight':[8, 4, 5, 6, 7],
'hight':[20, 35, 30, 33, 28]}

df = pd.DataFrame(data,
index = ['a1', 'a2', 'a3', 'a4', 'a5'])


print(df.describe())

结果1:

age     hight    weight
count 5.000000 5.00000 5.000000
mean 13.000000 29.20000 6.000000
std 4.062019 5.80517 1.581139
min 9.000000 20.00000 4.000000
25% 10.000000 28.00000 5.000000
50% 12.000000 30.00000 6.000000
75% 15.000000 33.00000 7.000000
max 19.000000 35.00000 8.000000

由结果可知,​​df.describe()​​将数值型数据的统计量计算出来了。

代码2:

print(df.describe(include = ['object']))

结果2:

name
count 5
unique 5
top Jack
freq 1

由结果可知,​​df.describe(include = [“object”])​​是对分类型(这里不是很确定,标记一下) 的数据进行描述性统计分析。

代码3:

print(df.describe(include = ['number']))

结果3:

age     hight    weight
count 5.000000 5.00000 5.000000
mean 13.000000 29.20000 6.000000
std 4.062019 5.80517 1.581139
min 9.000000 20.00000 4.000000
25% 10.000000 28.00000 5.000000
50% 12.000000 30.00000 6.000000
75% 15.000000 33.00000 7.000000
max 19.000000 35.00000 8.000000

由结果可知​​df.describe(include = [“number”])​​是对数值型的数据进行描述性统计分析,上述结果与结果1相同。

代码4:

print(df.describe(include = ['number', 'object']))

结果4:

age     hight name    weight
count 5.000000 5.00000 5 5.000000
unique NaN NaN 5 NaN
top NaN NaN Bai NaN
freq NaN NaN 1 NaN
mean 13.000000 29.20000 NaN 6.000000
std 4.062019 5.80517 NaN 1.581139
min 9.000000 20.00000 NaN 4.000000
25% 10.000000 28.00000 NaN 5.000000
50% 12.000000 30.00000 NaN 6.000000
75% 15.000000 33.00000 NaN 7.000000
max 19.000000 35.00000 NaN 8.000000

结果4基本上可以说,是结果2和结果3的堆叠。