Pandas是基于Numpy实现的,其名字来源于两个词语——面板数据(panel data)和数据分析(data analysis)。Pandas最初被应用于金融交易领域,而在经济学中,面板数据是关于多维数据的术语,因此,从Pandas的名字就可以看出它的功能——多维数据的分析。
Pandas也的确是python中必不可少的数据分析工具,为了将来能够应对数据处理的问题,我们还是需要对它进行学习的。
这里我们对文件的操作用的是kaggle的经典数据集——泰坦尼克号事件数据集。
第一行索引的中文意思:
单词 | 中文意思 |
---|---|
PassengerId | 乘客编号 |
Survived | 是否存活 |
Pclass | 客舱等级 |
Name | 姓名 |
Sex | 性别 |
Age | 年龄 |
Sibsp | 这名乘客在船上的同代直系亲属个数(兄弟姐妹或配偶) |
Parch | 这名乘客在船上的不同代直系亲属个数(父母或子女) |
Ticket | 船票编号 |
Fare | 船票价格 |
Cabin | 客舱号 |
Embarked | 登船港口 |
# 导入pandas并将其命名为pd,后面就省略了
import pandas as pd
# 消去列数过多时打印出的省略号,后面就省略了
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)
# 读取csv文件,后面就省略了
data = pd.read_csv('./train.csv')
# 显示前5行
print(data.head())
输出:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
可以看到,csv文件成功被读取并输出了前5行。
注:
如果文件是excel格式,可以使用函数pd.read_excel()来读取。
路径里的’./'是相对路径,表示当前文件夹。
head()方法是用来显示数据前5行的。
# 显示列名
print(data.columns)
输出:
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
# 显示文件的形状
print(data.shape)
输出:
(891, 12)
读入文件可以直接切片,也可以通过iloc和loc方法切片。
示例:
# 三种切片方法
save_1 = data[0:3]
save_2 = data.iloc[0:3, 0:3]
save_3 = data.loc[0:3, 'PassengerId':'Name']
print('直接切片:\n', save_1)
print('iloc切片:\n', save_2)
print('loc切片:\n', save_3)
输出:
直接切片:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
iloc切片:
PassengerId Survived Pclass
0 1 0 3
1 2 1 1
2 3 1 3
loc切片:
PassengerId Survived Pclass Name
0 1 0 3 Braund, Mr. Owen Harris
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer)
2 3 1 3 Heikkinen, Miss. Laina
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel)
注:
可以看到直接切片和使用iloc方法切片都是左闭右开的规则。
使用loc方法我们发现,其切片并不是基于索引的,而是基于标签的。而且loc遵守的是左闭右闭的规则。
切片时也可以设置步长。
示例:
# 设置步长,步长为2
save_1 = data.iloc[0:10:2]
print(save_1)
输出:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
6 7 0 1 McCarthy, Mr. Timothy J male 54.0 0 0 17463 51.8625 E46 S
8 9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.0 0 2 347742 11.1333 NaN S 1 PP 9549 16.7000 G6 S
直接切片标签
示例:
# 通过索引确定列
save_1 = data['Survived']
print(save_1)
输出:
0 0
1 1
2 1
3 1
4 0
..
886 0
887 1
888 0
889 1
890 0
Name: Survived, Length: 891, dtype: int64
标签后切片
示例:
# 通过索引确定列,然后选取行
save_1 = data['Survived'][0:5]
print(save_1)
输出:
0 0
1 1
2 1
3 1
4 0
Name: Survived, dtype: int64
乘除法
# 乘除法
save_1 = (data['Survived'] / 100)[0:5]
save_2 = (data['Survived'] * 100)[0:5]
print(save_1)
print(save_2)
输出:
0 0.00
1 0.01
2 0.01
3 0.01
4 0.00
Name: Survived, dtype: float64
0 0
1 100
2 100
3 100
4 0
Name: Survived, dtype: int64
加减法
# 加减法
save_1 = (data['Survived'] + 100)[0:5]
save_2 = (data['Survived'] - 100)[0:5]
print(save_1)
print(save_2)
输出:
0 100
1 101
2 101
3 101
4 100
Name: Survived, dtype: int64
0 -100
1 -99
2 -99
3 -99
4 -100
Name: Survived, dtype: int64
Pandas主要有两种数据结构,Series和DataFrame。
Series就是一维数组,只是加上了索引。
DataFrame就是前例中的表格,是二维数组,有行索引和列索引。
创建示例:
# 创建Series类数据
s1 = pd.Series([1, 2, 3])
print('Series:\n', s1)
# 创建DataFrame类数据
d1 = pd.DataFrame([[1, 'a'], [2, 'b']], columns=['number', 'letter'])
print('DataFrame:\n', d1)
输出:
Series:
0 1
1 2
2 3
dtype: int64
DataFrame:
number letter
0 1 a
1 2 b
# 创建DataFrame类数据
d1 = pd.DataFrame([[1, 'a'], [2, 'b']], columns=['number', 'letter'])
d2 = pd.DataFrame([[3, 'c'], [4, 'd']], columns=['number', 'letter'])
# 纵向连接
print(pd.concat([d1, d2]))
# 横向链接
print(pd.concat([d1, d2], axis=1))
输出:
number letter
0 1 a
1 2 b
0 3 c
1 4 d
number letter number letter
0 1 a 3 c
1 2 b 4 d
注:
这里axis是轴的意思,其默认值为0。在二维数组中,数据的坐标如下所示。
00 | 01 | 02 | 03 |
---|---|---|---|
10 | 11 | 12 | 13 |
20 | 21 | 22 | 23 |
这里axis轴为0的意思就是指坐标第一位数字增加的方向,由此表格可看出,是竖直向下的方向。
那么axis轴为1的意思就是坐标第二位数字增加的方向,是向右的。
由此我们可以知道,对于更高维的数组,axis为0就是指最高维索引增加的方向,其他数字以此类推。
交并集合并
# 创建DataFrame类数据
d1 = pd.DataFrame([[1, 'a'], [2, 'b']], columns=['number', 'letter'])
d2 = pd.DataFrame([[3, 'c', '一'], [4, 'd', '二']], columns=['number', 'letter', '中文'])
# 默认取并集
print(pd.concat([d1, d2]))
# 取交集
print(pd.concat([d1, d2], join='inner'))
输出:
number letter 中文
0 1 a NaN
1 2 b NaN
0 3 c 一
1 4 d 二
number letter
0 1 a
1 2 b
0 3 c
1 4 d
索引重置
# 创建DataFrame类数据
d1 = pd.DataFrame([[1, 'a'], [2, 'b']], columns=['number', 'letter'])
d2 = pd.DataFrame([[3, 'c'], [4, 'd']], columns=['number', 'letter'])
# 索引重置
print(pd.concat([d1, d2], ignore_index=True))
输出:
number letter
0 1 a
1 2 b
2 3 c
3 4 d
append方法由于其完全可以被concat代替,即将被Pandas删除,这里就不介绍了。