本文按照pandas文档来总结的,如果有错误的地方,欢迎指正
https://pandas.ac.cn/docs/

安装 pandas

1
pip install pandas

导入 pandas

1
import pandas as pd

读取表格或数据库

数据库以MySQL为例

支持相对路径,绝对路径,网络路径

读取操作返回DataFrame

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pandas as pd
import pymysql

# 在读取的时候添加parse_dates=["列名"],可使这个列变为Timestamp类型

# 读取csv表格文件
pd.read_csv("data.csv")

# 读取xlsx或者xls表格文件
pd.read_excel("data.xlsx")

# 读取MySQL
# 首先创建数据库连接对象
conn = pymysql.connect(
host="localhost", # 数据库地址
port=3306, # 数据库端口
user="root", # 登录用户名
password="123456", # 登录密码
database="example", # 数据库名称
charset="utf8" # 编码格式
)
#执行sql操作
# %s 是占位符, index_col 是索引字段,可以是字符串也可以是列表
sql = "select * from user limit %s,%s"
pd.read_sql(sql,con=conn,params=[10,20],index_col=["id","type"])

写入表格

1
2
3
4
5
6
7
8
9
10
11
12
13
# 写 csv 文件
import pandas as pd

# 读取read.csv表格
data_read = pd.read_csv("read.csv")
# 将read.csv表格写入到write.csv表格,并去除索引,在写入时不能打开write.csv
data_read.to_csv("write.csv",index=False)

# 将read.csv表格写入到write.txt文件里,并设置分割方式,去除索引,在写入时不能打开write.txt
data_read.to_csv("write.txt",sep="\t",index=False)

# 将read.csv表格写入到write.xlsx表格,并去除索引,在写入时不能打开write.xlsx
data_read.to_excel("write.xlsx",index=False)

选择 DataFrame 的子集

1
2
import pandas as pd
data = pd.read_csv("data.csv")

选择数值列

1
data.describe()

选择特定列

1
2
3
4
5
6
7
# 选择Age列
ages = data["Age"]
ages.head()

# 选择Name列和Age列
name_age = data[["Name","Age"]]
name_age.head()

选择特定行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 筛选年龄超过35岁的乘客
# data["Age"] > 35 将判断每一条数据的Age字段是否大于35
ages = data[data["Age"] > 35]
ages.head()

# 筛选泰坦尼克号 2 等舱和 3 等舱的乘客
# 第一种写法
class_23 = data[data["class"].isin([2,3])]
# 第二种写法
# 注: 不能用 or/and,需要用or运算符 | 和and运算符 &
class_23 = data[(data["class"] == 2) | (data["class"] == 3)]
class_23.head()

# 获取已知年龄的乘客数据
ages_no_na = data[data["Age"].notna()]
ages_no_na.head()

选择特定的行和列

需要在选择括号 [] 前面使用 loc/iloc 运算符。使用 loc/iloc 时,逗号前面的部分是要选择的行,逗号后面的部分是要选择的列

loc是基于行标签和列标签进行索引的,基本用法为 DataFrame.loc[行标签,列标签]
iloc是基于行和列的位置进行索引的,索引从0开始,基本用法为 DataFrame.iloc[行位置,列位置]

1
2
3
4
5
6
7
# 年龄大于35岁的乘客的姓名
names = data.loc[data["Age"] > 35,"Name"]
names.head()

# 获取第十行到30行的数据
datas = data.iloc[9,30]
datas.head()

从现有列创建新列

1
2
3
4
5
import pandas as pd
data = pd.read_csv("data.csv")

# 创建Age2列,值为Age列的2倍
data['Age2'] = data['Age'] * 2

修改列名称

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
data = pd.read_csv("data.csv")

data.rename(
columns={
"现有列名称":"新名称",
"Age":"年龄",
"name":"姓名"
}
)

# 也可以映射
data.rename(columns=str.lower)

计算汇总统计量

1
2
import pandas as pd
data = pd.read_csv("data.csv")

平均值

1
data["Age"].mean()

中位数

1
data["Price"].median()

特定组合

1
2
3
4
5
6
data.agg(
{
"Age": ["min","max","median","skew"],
"Fare": ["min","max","median","mean"]
}
)

按类别分组的汇总统计量

1、男性和女性泰坦尼克号乘客的平均年龄是多少?

1
2
3
4
5
6
7
8
# 先查询出Sex字段和Age字段的数据,然后将数据根据Sex分组,最后求年龄的平均值
data[['Sex','Age']].groupby("Sex").mean()

# 如果没有显式的选择Sex和Age两列,那么就需要使用numeric_only=True应用包含数值列的每一项
data.groupby("Sex").mean(numeric_only=True)

# 也可以对分组数据的列选择
data.groupby("Sex")['Age'].mean()

2、每个性别和客舱等级组合的平均票价是多少?

1
data.groupby(["Sex","Pclass"])['Fare'].mean()

按类别统计记录数

1、每个客舱等级有多少乘客?

1
2
3
4
5
6
7
# value_counts是一个快捷方式,它实际上是分组操作与每个组内记录数的计数相结合
# 两个相同
data['Pclass'].value_counts()
data.groupby("Pclass")['Pclass'].count()

# size 和 count 都可以与 groupby 结合使用。而 size 包含 NaN 值,只提供行数(表格的大小),count 排除缺失值。在 value_counts 方法中,使用 dropna 参数来包含或排除 NaN 值。
data.groupby("Pclass")['Pclass'].size()

排序

1
2
3
4
5
6
7
8
9
10
# 根据Age进行排序
# 基本用法: sort_values(by,axis,ascending,inplace,kind,na_position)
# by: 根据哪一列排序,可以为一个列表
# axis: 轴来指导排序
# ascending: 如果为真,按升序排序,否则按降序排序
# inplace: 如果为真,就地执行操作
# kind: 选择排序算法
# na_position: 参数'first'将NaNs放在开头,'last'将NaNs放在结尾
titanic.sort_values(by="Age").head()
# sort_index和sort_value基本相似,只是一个按索引排序,一个按字段排序

数据重塑

1
2
3
4
5
6
7
# pivot(data,columns,index,values)
# data: 数据帧
# columns: str | object | str列表,用于创建新框架的列的列
# index: str | object | str列表,可选,用于创建新帧索引的Column,如果未给出,则使用现有索引
# values: str、对象或上一个列表,可选,用于填充新帧值的列,如果不指定,则将使用所有剩余列,结果将具有分层索引列
# 返回重塑的DataFrame
data.pivot()

透视表

在 pivot() 的情况下,数据只是重新排列。当需要聚合多个值时,可以使用 pivot_table(),它提供一个聚合函数(例如平均值)来组合这些值。

1
data.pivot_table(values="value", index="location", columns="parameter", aggfunc="mean")

创建新索引

reset_index()

1
data.pivot(columns="location", values="value").reset_index()

合并

1
2
3
data1 = pd.read_csv("data1.csv")
data2 = pd.read_csv("data2.csv")
pd.concat([data1,data2],axis=0)

merge

基本用法: merge(left,right,how,on,left_on,right_on,left_index,right_index,sort,suffixes,copy,indicator,validate)

详细解释见: https://pandas.pydata.org/docs/reference/api/pandas.merge.html#pandas.merge

时间序列数据

1
pd.to_datetime(data["datetime"])

操作文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 将Name字段的所有内容全部转为小写
data['Name'].str.lower

# 分割Name字段的所有内容
data['Name'].str.split(",")

# 基本用法: contains(pat,case,flags,na,regex)
# pat: 字符串或正则
# case: 是否区分大小写,默认True
# flags: 默认0,传递给 re 模块的标志,例如 re.IGNORECASE 的 CASE。
# na: 可选,默认对空值不处理,即输出结果还是nan
# 文本包含,是否包含Countess字符串,包含返回True,不包含返回False,NaN返回NaN
data['Name'].str.contains("Countess")

# 获取Name长度
data['Name'].str.len()

# 获取名字最长的那一个Name
data.loc[data['Name'].str.idxmax(),"Name"]

# 替换,将“male”的值替换为“M”,将“female”的值替换为“F”。
data['Name'].replace({"male": "M", "female": "F"})