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)
|