目录
- 一、数据重塑
-
- [1.1 透视](#1.1 透视)
- [1.2 透视表](#1.2 透视表)
- [1.3 堆栈/反堆栈](#1.3 堆栈/反堆栈)
- [1.3 融合](#1.3 融合)
- 二、迭代
- 三、高级索引
-
- [3.1 基础选择](#3.1 基础选择)
- [3.2 通过isin选择](#3.2 通过isin选择)
- [3.3 通过Where选择](#3.3 通过Where选择)
- [3.4 通过Query选择](#3.4 通过Query选择)
- [3.5 设置/取消索引](#3.5 设置/取消索引)
- [3.6 重置索引](#3.6 重置索引)
-
- [3.6.1 前向填充](#3.6.1 前向填充)
- [3.6.2 后向填充](#3.6.2 后向填充)
- [3.7 多重索引](#3.7 多重索引)
- 四、重复数据
- 五、数据分组
-
- [5.1 聚合](#5.1 聚合)
- [5.2 转换](#5.2 转换)
- 六、缺失值
- 七、合并数据
-
- [7.1 合并-Merge](#7.1 合并-Merge)
- [7.2 连接-Join](#7.2 连接-Join)
- [7.3 拼接-Concatenate](#7.3 拼接-Concatenate)
-
- [7.3.1 纵向拼接](#7.3.1 纵向拼接)
- [7.3.2 横向/纵向拼接](#7.3.2 横向/纵向拼接)
- 八、日期
- 九、可视化
pandas 是一个功能强大的 Python 数据分析库,为数据处理和分析提供了高效且灵活的工具。它是在 NumPy 的基础上构建的,为处理结构化数据(如表格数据)和时间序列数据提供了丰富的数据结构和数据操作方法。
pandas 提供了两种主要的数据结构:Series 和 DataFrame。Series 是一维标记型数组 ,类似于带标签的列表,可以存储不同类型的数据。DataFrame 是二维的表格型数据结构 ,类似于关系型数据库中的表格,它由多个 Series 组成,每个 Series 都有一个共同的索引。这使得 pandas 在处理和分析数据时非常方便和高效。
使用 pandas,我们就可以轻松地进行数据导入 、数据清洗 、数据转换 、数据筛选 和数据分析 等操作。它提供了丰富的函数和方法,如索引 、切片 、聚合 、合并 、排序 、统计 和绘图等,使得数据分析变得简单而直观。
一、数据重塑
1.1 透视
假设我们有一个 DataFrame df2 ,其中包含了 'Date '、'Type ' 和 'Value ' 这三列数据。想要将 'Type' 列的唯一值作为新 DataFrame 的列,'Date' 列作为新 DataFrame 的索引,并将 'Value' 列中对应的值填充到新 DataFrame 的相应位置上。
即 将行变为列 ,我们可以这么实现代码:
python
>>> df3= df2.pivot(index='Date',columns='Type', values='Value')
下面来对pivot() 函数的参数做一下说明:
index:指定作为新 DataFrame 索引的列名 ,这里是 'Date' 列。
columns:指定作为新 DataFrame 列的列名 ,这里是 'Type' 列的唯一值。
values:指定填充到新 DataFrame 中的值的列名,这里是 'Value' 列。
1.2 透视表
使用了 pd.pivot_table() 函数来 创建一个透视表 。pivot_table() 函数可以帮助我们在 pandas 中进行数据透视操作,并实现将一个 DataFrame 中的值按照指定的行和列进行聚合 。
即 将行变为列,我们可以这么实现:
python
>>> df4 = pd.pivot_table(df2,values='Value',index='Date',columns='Type'])
下面来解释一下里面出现的各参数的含义:
其中,'df2 ' 是原始的 DataFrame,'Value ' 是要聚合的数值列名,'Date ' 是新 DataFrame 的索引列名,而 'Type ' 是新 DataFrame 的列名。
pd.pivot_table() 函数会将 df2 中的数据按照 'Date' 和 'Type' 进行分组,并计算每个组中 'Value' 列的聚合值(默认为均值)。然后,将聚合后的结果填充到新的 DataFrame df4 中 ,其中 每一行表示一个日期,每一列表示一个类型 。
如果在透视表操作中存在重复的索引/列组合 ,pivot_table() 函数将会使用默认的聚合方法(均值)进行合并 。如果我们想要使用其他聚合函数,可以通过传递 aggfunc 参数来进行设置,例如 aggfunc='sum' 表示求和。
1.3 堆栈/反堆栈
stack() 和 unstack() 是 pandas 中用于处理层次化索引的函数,可以在 多级索引的 DataFrame 中透视行和列标签。
python
>>> stacked = df5.stack()
# 透视列标签
# 使用 stack() 函数将列标签透视,即将列标签转换为行索引,并将相应的数据堆叠起来。这样可以创建一个具有多级索引的 Series
>>> stacked.unstack()
# 透视索引标签
# 上述代码则使用 unstack() 函数将索引标签透视,即将行索引转换为列标签,并将相应的数据重新排列。这样可以还原出原始的 DataFrame 结构
1.3 融合
我们需要 将指定的列转换为一个观察值列时 ,可以使用 pd.melt() 函数来将一个 DataFrame 进行融合操作(melt)。
将列转为行:
python
>>> pd.melt(df2,id_vars=["Date"],value_vars=["Type","Value"],value_name="Observations")
其中,df2 是原始的 DataFrame,id_vars=["Date"] 表示保持 'Date' 列不融合 ,作为 标识变量(也就是保持不动的列 )。value_vars=["Type", "Value"] 指定要融合的列为 'Type' 和 'Value'。value_name="Observations" 表示新生成的观察值列的名称为 'Observations'。
pd.melt() 函数会将指定的列进行融合操作,并创建一个新的 DataFrame。融合后的 DataFrame 中会包含四列 ,分别是融合后的标识变量('Date')、融合的列名('variable')、融合的值('Observations')以及原始 DataFrame 中对应的观察值。
二、迭代
df.iteritems()是一个 DataFrame 的迭代器方法 ,用于按列迭代 DataFrame 。它返回一个生成器,每次迭代生成一个包含列索引和对应列的序列的键值对 。
df.iterrows() 也是一个 DataFrame 的迭代器方法 ,用于按行迭代 DataFrame 。它返回一个生成器,每次迭代生成一个包含行索引和对应行的序列的键值对。
python
>>> df.iteritems()
# (列索引,序列)键值对
>>> df.iterrows()
# (行索引,序列)键值对
下面是一些基本操作:
python
for column_index, column in df.iteritems():
# 对每一列进行操作
print(column_index) # 打印列索引
print(column) # 打印列的序列
for index, row in df.iterrows():
# 对每一行进行操作
print(index) # 打印行索引
print(row) # 打印行的序列
三、高级索引
3.1 基础选择
DataFrame 中基于条件选择列的操作如下,都是一些基本的操作:
python
>>> df3.loc[:,(df3>1).any()]
# 选择任一值大于1的列
>>> df3.loc[:,(df3>1).all()]
# 选择所有值大于1的列
>>> df3.loc[:,df3.isnull().any()]
# 选择含 NaN值的列
>>> df3.loc[:,df3.notnull().all()]
# 选择含 NaN值的列
3.2 通过isin选择
而在很多情况下,我们所需要做的不是仅仅通过基于条件选择列这么简单的操作 ,所以还有必要学习 DataFrame 的进一步选择和筛选操作。
python
>>> df[(df.Country.isin(df2.Type))]
# 选择为某一类型的数值
>>> df3.filter(items="a","b"])
# 选择特定值
>>> df.select(lambda x: not x%5)
# 选择指定元素
3.3 通过Where选择
where()是Pandas Series对象中的一个方法 ,也可以用于选择满足条件的子集。
python
>>> s.where(s > 0)
# 选择子集
3.4 通过Query选择
python
>>> df6.query('second > first')
# 查询DataFrame
df6.query('second > first') 是 DataFrame 对象中的一个查询操作,查询 DataFrame df6 中满足条件 "second > first" 的行。其中,"second " 和 "first " 是列名,表示要比较的两个列。只有满足条件的行会被选中并返回为一个新的 DataFrame。
3.5 设置/取消索引
python
>>> df.set_index('Country')
# 设置索引
>>> df4 = df.reset_index()
# 取消索引
>>> df = df.rename(index=str,columns={"Country":"cntry","Capital":"cptl","Population":"ppltn"})
# 重命名DataFrame列名
3.6 重置索引
有时候我们需要重新索引 Series。
将 Series s 的索引重新排列为 ['a', 'c', 'd', 'e', 'b'],并返回一个新的 Series。如果 原来的索引中不存在某个新索引值 ,对应的值将被设置为 NaN(缺失值)。
python
>>> s2 = s.reindex(['a','c','d','e','b'])
3.6.1 前向填充
python
>>> df.reindex(range(4), method='ffill')
Country Capital Population
0 Belgium Brussels 11190846
1 India New Delhi 1303171035
2 Brazil Brasília 207847528
3 Brazil Brasília 207847528
3.6.2 后向填充
python
>>> s3 = s.reindex(range(5), method='bfill')
0 3
1 3
2 3
3 3
4 3
3.7 多重索引
python
>>> arrays = [np.array([1,2,3]),
np.array([5,4,3])]
>>> df5 = pd.DataFrame(np.random.rand(3, 2), index=arrays)
>>> tuples = list(zip(*arrays))
>>> index = pd.MultiIndex.from_tuples(tuples,
names=['first', 'second'])
>>> df6 = pd.DataFrame(np.random.rand(3, 2), index=index)
>>> df2.set_index(["Date", "Type"])
四、重复数据
python
>>> s3.unique()
# 返回唯一值
>>> df2.duplicated('Type')
# 查找重复值
>>> df2.drop_duplicates('Type', keep='last')
# 去除重复值
>>> df.index.duplicated()
# 查找重复索引
五、数据分组
5.1 聚合
python
>>> df2.groupby(by=['Date','Type']).mean()
>>> df4.groupby(level=0).sum()
>>> df4.groupby(level=0).agg({'a':lambda x:sum(x)/len(x),
'b': np.sum})
5.2 转换
python
>>> customSum = lambda x: (x+x%2)
>>> df4.groupby(level=0).transform(customSum)
六、缺失值
python
>>> df.dropna()
# 去除缺失值NaN
>>> df3.fillna(df3.mean())
# 用预设值填充缺失值NaN
>>> df2.replace("a", "f")
# 用一个值替换另一个值
七、合并数据
7.1 合并-Merge
python
>>> pd.merge(data1, data2, how='left', on='X1')
将 data1 和 data2 两个 DataFrame 按照它们的 'X1' 列进行左连接,并返回一个新的 DataFrame。左连接****保留 data1 的所有行 ,并将 data2 中符合条件的行合并到 data1 中。如果 data2 中没有与 data1 匹配的行,则对应的列值将被设置为 NaN(缺失值)。
python
>>> pd.merge(data1, data2, how='right', on='X1')
右连接也是一种连接方式,其将 data1 和 data2 两个 DataFrame 按照它们的 'X1' 列进行右连接,并返回一个新的 DataFrame。保留 data2 的所有行 ,并将 data1 中符合条件的行合并到 data2 中。如果 data1 中没有与 data2 匹配的行,则对应的列值将被设置为 NaN(缺失值)。
python
>>> pd.merge(data1, data2,how='inner',on='X1')
将 data1 和 data2 两个 DataFrame 按照它们的 'X1' 列进行内连接,并返回一个新的 DataFrame就是所谓的内连接(inner join)。它 仅保留 data1 和 data2 中在 'X1' 列上有匹配的行,并将它们合并到一起。
参数中的 how='inner' 表示使用内连接方式进行合并。其他可能的取值还有 'left'、'right' 和 'outer',分别表示左连接 、右连接 和接下来要介绍的外连接 。on='X1' 表示使用 'X1' 列作为合并键(即共同的列)。
python
>>> pd.merge(data1, data2, how='outer',on='X1')
将 data1 和 data2 两个 DataFrame 按照它们的 'X1' 列进行外连接,并返回一个新的 DataFrame 。外连接(outer join)是一种合并方式,它会保留 data1 和 data2 中所有的行,并将它们根据 'X1' 列的值进行合并。
在外连接中,如果某个 DataFrame 中的行在另一个 DataFrame 中找不到匹配,那么对应的列值将被设置为 NaN(缺失值),表示缺失的数据。
7.2 连接-Join
python
>>> data1.join(data2, how='right')
7.3 拼接-Concatenate
7.3.1 纵向拼接
python
>>> s.append(s2)
7.3.2 横向/纵向拼接
python
>>> pd.concat([s,s2],axis=1, keys=['One','Two'])
>>> pd.concat([data1, data2], axis=1, join='inner')
八、日期
python
>>> df2['Date']= pd.to_datetime(df2['Date'])
>>> df2['Date']= pd.date_range('2000-1-1', periods=6, freq='M')
>>> dates = [datetime(2012,5,1), datetime(2012,5,2)]
>>> index = pd.DatetimeIndex(dates)
>>> index = pd.date_range(datetime(2012,2,1), end, freq='BM')
九、可视化
Matplotlib 是一个用于绘制数据可视化图形的 Python 库。它提供了各种函数和工具,用于创建各种类型的图表,包括线图、散点图、柱状图、饼图等等。
现在我们导入 Matplotlib 库,并将其重命名为了 plt。这样,我们就可以 使用 plt 对象来调用 Matplotlib 的函数和方法,以便创建和修改图形了。
python
>>> import matplotlib.pyplot as plt
现在,我们试试导入 Matplotlib 库使用 Pandas 库中 Series 对象 的 .plot() 方法 和 Matplotlib 库 中的 plt.show() 函数 来生成并显示数据的默认图形。
python
>>> s.plot()
>>> plt.show()
我们也可使用 Pandas 库中 DataFrame 对象 的 .plot() 方法 和 Matplotlib 库 中的 plt.show() 函数 来生成并显示数据的默认图形。
python
>>> df2.plot()
>>> plt.show()