Contents

Python-第三方库-Pandas

PYPI官网

pandas官网

pandas API文档

pandas 提供快速、灵活和富有表现力的数据结构,旨在使处理“关系”或“标记”数据简单又直观

安装

anaconda

1
conda install pandas

pip

1
pip install pandas

常用函数

  • pd.DataFrame():创建df
  • pd.concat():合并两个结构相似的表
  • pd.merge():连接两个表,on参数指定参照的key,how参数选择连接方式
  • pd.to_datetime():将字符串Series转换为datetime对象Series,该类型为DatetimeIndex
  • pd.read_xxx():读取xxx类型文件并返回df,parse_dates参数进行datetime对象列的转换

数据类型

dataframe和series(单列的df)方法:

  • describe():对数值列进行统计并返回dataframe,百分号为百分位数
  • max():获取最大值
  • count():行数
  • mean():平均值
  • std():方差
  • min():最小值
  • pivot():重塑df,以选择一列的值作为新df的列名,colume参数选择选择的列,values参数设置默认值,index选择索引(没有index则使用原表的index)
  • reset_index():添加新的索引列,id_vars参数指定新df的索引列
  • pivot_table():和pivot类似,但是该方法统计聚合值
  • head():返回前N行的df
  • tail():返回最后N行的df
  • to_xxx():将df转换为xxx类型文件
  • isin():转换Series为布尔Series,值包含在其中的行为True,否则为False
  • notna():转换Series为布尔Series,值不为None则为True,否则为False
  • plot():生成plot绘图对象,之后可以使用matplotlib.pyplot.show()显式结果
  • rename():修改列名
  • agg():给出列名和对于列要统计的聚合量,返回df
  • groupby():按给定列的不同值进行分组,返回DataframeGroupby对象,该对象拥有和pd类似的方法和运算符
  • value_counts():给定列统计不同值的行数,返回df
  • info():查看技术信息
  • set_index():设置索引列
  • resample():具有DatetimeIndex对象列的df的方法,按给定频率将时间索引进行分组,后面可以使用聚合函数来获取聚合值
  • idxmax():返回Series中最大值所在行的索引值
  • replace():使用to_replace参数的字典对行进行替换,返回df

属性

  • dtypes:返回每列的类型的df
  • plot:plot画图属性,返回PlotAccessor对象
  • str:对列的文本值进行操作的对象,返回StringMethod对象

运算符:

  • 加减乘除和逻辑运算
  • []:读取特定列返回df,作为左值时修改原df
  • loc[]:根据传入布尔Series过滤行并选择列返回df,作为左值时修改原df
  • iloc[]:直接传入行数和列数返回df,作为左值时修改原df

PlotAccessor

方法

  • xxx():画出xxx图,后面可以用matplotlib.pyplot.show()显式结果,比如scatter,box等,详见文档

datetime

属性

  • dt:通过该属性访问year,month等具体信息,这些信息可以用于给原df分组groupby

DatetimeIndex

方法:具有和df类似的方法

DatetimeIndexResampler

方法:具有和df类似的方法

属性:

  • freq:分组频率

StringMethod

方法

  • lower():转换为小写
  • split():按pat参数指定的字符串分割每行的值,返回Series
  • get():获取每行第n个元素,返回Series
  • contains():判断每行是否包含pat参数的字符串,返回布尔Series
  • len():返回每行的长度,返回Series

入门教程

处理的数据类型

1
import pandas as pd

DataFrame

https://pandas.pydata.org/docs/_images/01_table_dataframe.svg
DataFrame
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
df = pd.DataFrame(
    {
        "Name": [
            "Braund, Mr. Owen Harris",
            "Allen, Mr. William Henry",
            "Bonnell, Miss. Elizabeth",
        ],
        "Age": [22, 35, 58],
        "Sex": ["male", "male", "female"],
    }
)

DataFrame是一种二维数据结构,可以在列中存储不同类型的数据(包括字符、整数、浮点值、分类数据等),类似于excel

使用下标访问Series列

1
df["Age"]
https://pandas.pydata.org/docs/_images/01_table_series.svg
Series

Series也可以创建

1
ages = pd.Series([22, 35, 58], name="Age")

许多 pandas 操作返回 DataFrame 或 Series

常用方法,更多详见文档

如何读取和写入表格数据

https://pandas.pydata.org/docs/_images/02_io_readwrite.svg
Series

read_xxx()函数读取xxx类型文件并返回DataFrame,如read_csv()函数读取csv文件并返回DataFrame,其他的还有csv、excel、sql、json、parquet 等

1
titanic = pd.read_csv("data/titanic.csv")

to_xxx()函数存储DataFrame为xxx类型文件

1
titanic.to_excel("titanic.xlsx", sheet_name="passengers", index=False)

df.head(N)方法查看df的前N行,df.tail(N)方法查看df的最后N行

1
2
titanic.head(8)
titanic.tail(10)

df.types属性查看每列的数据类型

1
titanic.dtypes

df.info()方法查看df的技术信息

1
titanic.info()

如何选择 df 的子集

https://pandas.pydata.org/docs/_images/03_subset_columns.svg
选择列

使用[]选择单个列,返回Series对象,或选择多个列的列表,返回df对象

df.shape属性返回一个元组,包含行数和列数,series.shape属性返回只包含行数的元组

1
age_sex = titanic[["Age", "Sex"]]

传入[]布尔值Series过滤特定行

1
above_35 = titanic[titanic["Age"] > 35]
https://pandas.pydata.org/docs/_images/03_subset_rows.svg
过滤行

除了比较运算符还可以用来生成布尔Series的函数

  • isin([…]):值含于列表中
  • notna():值不为None
1
class_23 = titanic[titanic["Pclass"].isin([2, 3])]

布尔值Series之间可以进行逻辑运算

1
class_23 = titanic[(titanic["Pclass"] == 2) | (titanic["Pclass"] == 3)]
https://pandas.pydata.org/docs/_images/03_subset_columns_rows.svg
选择特定行和列

[]前面添加loc运算符,第一个参数是行过滤条件,第二个参数是选择的列

1
adult_names = titanic.loc[titanic["Age"] > 35, "Name"]

还可以使用iloc函数直接指定行数和列数

1
titanic.iloc[9:25, 2:5]

使用loc和iloc选择单列时可以直接赋值

1
titanic.iloc[0:3, 3] = "anonymous"

如何创建plot绘图

https://pandas.pydata.org/docs/_images/04_plot_overview.svg
plot绘图
1
2
import pandas as pd
import matplotlib.pyplot as plt

读取csv文件并设置索引列参数index_col,这里索引列是date类型,所以需要参数parse_dates为true转换一下

1
air_quality = pd.read_csv("air_quality_no2.csv", index_col=0, parse_dates=True)

创建plot对象,然后展示plot对象

1
2
air_quality.plot()
plt.show()

df.plot.scatter方法比较两个列的散点图,参数x和参数y选择列名,

1
2
air_quality.plot.scatter(x="station_london", y="station_paris", alpha=0.5)
plt.show()

df.plot.box方法画箱线图

1
2
air_quality.plot.box()
plt.show()

除了scatter和box还有很多其他的图,比如箱线图,详见文档

df.plot.area画堆积面积图,figsize为一个二元组表示图表的长和宽,参数subplots将每一列单独放到一个图中,其他图也可以使用这两个参数,类似参数详见文档

1
2
air_quality.plot.area(figsize=(12, 4), subplots=True)
plt.show()

pandas 创建的每个绘图对象都是一个 Matplotlib 对象

从现有列派生的新列

https://pandas.pydata.org/docs/_images/05_newcolumn_1.svg
派生新列

[]传入新列名称并赋值,可以直接用一个Series进行运算的结果赋值

1
air_quality["london_mg_per_cubic"] = air_quality["station_london"] * 1.882

可以直接将Series加减乘除一个值或逻辑运算,会给每一个元素进行这样的运算,Series之间也可以进行加减乘除运算或逻辑运算,会逐个对应元素进行运算。如果需要更高级的逻辑可以使用apply方法

1
air_quality["ratio_paris_antwerp"] = air_quality["station_paris"] / air_quality["station_antwerp"]

rename方法重命名列标签,未重命名的列保持原名

1
2
3
4
5
6
7
8
9
air_quality_renamed = air_quality.rename(
    columns={
        "station_antwerp": "BETR801",
        "station_paris": "FR04014",
        "station_london": "London Westminster",
    }
)
air_quality_renamed.plot()
plt.show()

还可以使用函数来重命名映射,如str.lower将名称转换为小写

1
2
air_quality_renamed = air_quality_renamed.rename(columns=str.lower)
air_quality_renamed.head()

计算汇总统计量

聚合统计

DataFrame.agg方法定义给定列的聚合统计信息的特定组合,更多聚合统计信息见文档

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

返回以键为列名,所有值列表的并集为index索引的dataframe

https://pandas.pydata.org/docs/_images/06_groupby_select_detail.svg
groupby

groupby方法将dataframe按指定列的值分组,然后可以给每一组求聚合统计信息,分组也拥有df的几乎所有方法

1
titanic[["Sex", "Age"]].groupby("Sex").mean()

返回以选择的列名为返回值的列明,groupby列不同值为索引的dataframe

整个过程为:

  • 将数据分组
  • 将函数独立应用于每个组
  • 将结果组合成数据结构

也可以先分组再选择列

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

可以选择多个列进行分组

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

groupby文档详解

value_counts方法统计每种值的行数,其实是分组操作的组合,常用于离散化

1
2
3
titanic["Pclass"].value_counts()
# 等价于
titanic.groupby("Pclass")["Pclass"].count()

重塑dataframe的布局

df.sort_values方法排序行,by参数选择排序依据的列,ascending参数确定是否升序排列,默认升序。排序详细内容文档

1
titanic.sort_values(by=['Pclass', 'Age'], ascending=False).head()

前面如何选择df子集,可以传入布尔值df来取子集

1
no2 = air_quality[air_quality["parameter"] == "no2"]
https://pandas.pydata.org/docs/_images/07_pivot.svg
pivot

pivot()方法重塑df,以选择的列的不同值为新df的列,colume参数为选择的列,values参数设置默认值,index选择索引(没有index则使用原表的index,修改index后会表格会取平均值),更多详见官网文档

reset_index()方法将添加新的索引列

1
no2_pivoted = no2.pivot(columns="location", values="value").reset_index()
https://pandas.pydata.org/docs/_images/07_melt.svg
melt

melt()方法与pivot()方法相反的转换,id_vars参数指定新df的索引列

1
no_2 = no2_pivoted.melt(id_vars="date.utc")

pivot方法只是将数据重新排列多个值将出现多个索引值,列聚合值可以使用pivot_table()方法,它多了一个aggfunc参数标记聚合值,将margins参数设为True时会统计边际总和值

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

如何合并多个表的数据

concat函数合并两个结构相似的df

1
pd.concat([air_quality_pm25, air_quality_no2], axis=0)

merge函数根据on参数连接两个df,how参数选择连接方式,可以选择内连接,外连接和左右连接

1
air_quality = pd.merge(air_quality, stations_coord, how="left", on="location")

如何轻松处理时间序列数据

to_datetime函数将字符串Series转换为datetime对象列,该对象为DatetimeIndex

1
air_quality["datetime"] = pd.to_datetime(air_quality["datetime"])

另外在read_csv函数中添加parse_dates参数可以在读取文件时顺便转换

1
pd.read_csv("../data/air_quality_no2_long.csv", parse_dates=["datetime"])

datetime对象的dt属性访问详细日期信息,且该信息可以像df中的普通列一样进行分组groupby

1
2
3
air_quality["month"] = air_quality["datetime"].dt.month
# 用于分组
air_quality.groupby([air_quality["datetime"].dt.weekday, "location"])["value"].mean()

索引为datetime对象时可以不通过dt属性,而使用index属性来访问内部时间信息

1
no_2.index.year, no_2.index.weekday

resample方法按给定频率将时间索引进行分组,结果时DatetimeIndexResampler对象,它后面可以使用聚合函数来获取聚合值

1
monthly_max = no_2.resample("M").max()

如何操作文本数据

通过列的str属性来访问StringMethod对象的文本方法

lower()方法转换为小写

1
titanic["Name"].str.lower()

split()方法按pat参数指定的字符串分割每行的值,返回Series

1
titanic["Name"].str.split(",")

get()方法获取每行第n个元素,返回Series

1
titanic["Surname"] = titanic["Name"].str.split(",").str.get(0)

contains()方法判断每行是否包含pat参数的字符串,返回布尔Series

1
titanic["Name"].str.contains("Countess")

len()方法返回每行的长度,返回Series

1
titanic["Name"].str.len()

Series.idxmax()方法返回最大值所在行的索引值

1
titanic["Name"].str.len().idxmax()

Series.replace()方法使用to_replace参数的字典对行进行替换

1
titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"})
 |