pandas是用于数据处理与数据分析的三方库,用于对结构化数据(表格数据、时间序列等)进行读取、清洗、计算和分析
DataFrame是pandas的核心数据结构之一,为一张带行索引和列名的二维表

pandas输出存在自动省略(ellipsis)行为
打印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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
pd.set_option('display.max_columns',None)  //显示所有列
pd.set_option('display.max_rows',None) //显示所有行
pd.reset_option('display.max_rows') //恢复行的默认行为
pd.reset_option('display.max_*') //恢复所有默认行为

pd.read_html(url) //解析HTML并自动提取<table>标签
{
html=下载网页(url)
dom=解析_html(html)
tables=找到所有<table>
dfs=-把每个table转成DataFrame
return dfs
}

//pd.read_html()的返回值不是一个表,而是表的列表,默认把网页中所有<table>读出,必须索引指定哪一个表
//pd.read_html(url)[0]中,[0]看起来像随便写,但它不是为了避免报错,而是为了消除不确定性,不存在表格仍会报错


DataFrame.head() //Series.head()用于查看前N行数据,默认返回前5行,直接套在pd.read_html(url)上会报错(无索引对象类型不明确无法进行DataFrame操作)

iloc是按位置索引器
df.iloc[:,2]表示取所有行的第3

df.dropna()表示只要某行存在NaN该行就会被删除,默认不原地修改而是返回新的DataFrame,需要变量去接收或标明要原地修改df.dropna(inplace=True)。
不推荐原地修改,内部inplace=True的操作仍是创建新对象来替换旧对象,性能并没有提升。

df=df.dropna(axis=1)显性指定axis沿着列扫描,某一行出现NaN则删除该列
df.dropna(subset=['start_time','lock_time'])subset用来标定作用范围,这里表示只检查这两列是否存在NaN

由于字符串不能直接进行时间运算,需使用pd.to_datetime()把看起来像时间的字符串统一转换成pandas的时间类型(datetime64[ns])。
pd.to_datetime()能解析字符串中包含的年/月/日/时/分/秒,并将其转换为统一的时间表示,同时标记为datetime类型
pd.to_datetime(...,errors='coerce')表示将无法解析的时间字符串直接转换为NaT(Not a Time,pandas里的缺失时间值,不是字符串),而不是抛出异常
只有数据是datetime类型才能使用.dt.total_seconds()

datetime类型是时间点(timestamp),精度是纳秒ns,不是时间计数
2023-01-01 12:34:56
dtype:datetime64[ns]

pandas是动态列模型,为空列赋内容时df['column']=...,若该列不存在会自动生成同名新列

df = df[
(df['minutes']>=1)&
(df['minutes']<=180)
]
布尔索引(Boolean Indexing),先生成条件布尔Series:
0 True
1 False
2 True
多个条件用&合并(逐行AND)得到[True,False,True,...]
使用布尔结果筛选行,将True行保留,False行丢弃,得到过滤后的新DataFrame

set_index把原本是普通列的数据,改成行索引(index)
pandas里每行必须有一个行名index,默认情况下是0,1,2,3,...
df.set_index(['学号','姓名'])用(学号,姓名)这一对值,唯一标识一行数据行索引变成(200110920401,陈思慧)

df.loc按index/columns的标签查找,包含端点
df.iloc按索引位置查找,不包含端点

.loc语义和编程模型上是并行,向量化的
从CPU执行层面看不是Python级并行,而是底层批量计算
pandas向量化,本质是把必须发生的遍历,从Python解释器,下沉到C/NumPy层去执行。c的效率比python快几十倍(笑)

DataFrame中通过条件过滤修改值,会导致SettingWithCopyWarning警告,并且可能不修改原始 DataFrame值。需要使用.loc确保原地修改数据

result=df.loc[
df['班级']=='20经贸类4',
['作业','实验','出勤','期末']
] //可以用布尔索引选取行后再使用列索引选取列

DataFrame(表)
df=pd.DataFrame({
'成绩':[80,90,85],
'排名':[3,1,2]
})
Series(一维)
s=pd.Series(
[92.4,61.8,78.6],
index=['最大值','最小值','平均值']
)

df.groupby()返回一个分组对象,不做任何计算
as_index控制分组键(groupby的字段)是在索引里,还是在普通列里
as_index=False仍然是普通列,不写as_index(默认)字段就会跑到左边当行名用了

.index记录编码,取结果的行索引
.isin判断这个值在不在给定集合里,返回的是True/False组成的一张布尔表

.sort_values(by=' ',ascending=False)
.sort_values按值排序,by用哪列作为排序依据,ascending=False降序排列(从大到小)
.head(20)取当前结果的前20行,不写默认前5

透视表
pd.pivot_table(
df,
index='顾客',
columns='商品',
values='金额', //可以填tuple['总价', '数量'],会自动生成多级列索引
aggfunc='sum'
)
index:行怎么分(左边)
columns:列怎么分(上边)
values:算哪一列
aggfunc:怎么算(sum/mean/count),告诉pandas用哪种内置聚合规则
分组+统计+变成交叉表
按索引/分组填入和原表的行顺序完全无关,找到该出现的位置再放值

pd.merge用于根据指定的条件将两个DataFrame进行合并
pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True)
how合并方式:默认inner返回两个DataFrame共有行;outer返回两个DataFrame所有行,缺失部分用NaN填充;left以左侧数据为主,右侧缺失部分用NaN填充;右侧类似
on:通过列或索引进行匹配,两个DataFrame中都需要有的列

pandas读取文件

csv(.csv)
import pandas as pd
df=pd.read_csv("data.csv",encoding="UTF-8") //encoding默认UTF-8,但文件可能是gbk编码
print(df)

Excel(.xlsx)
import pandas as pd //需要openpyxl模块(conda install openpyxl)
df=pd.read_excel("data.xlsx",sheet_name="Sheet",index_col=0) //sheet可省,index=0 表示把Excel第1列作为DataFrame行索引,也就是不显示行号
print(df)