目录
- 一、数据重塑
- 1.1 透视
- 1.2 透视表
- 1.3 堆栈/反堆栈
- 1.3 融合
- 二、迭代
- 三、高级索引
- 3.1 基础选择
- 3.2 通过isin选择
- 3.3 通过Where选择
- 3.4 通过Query选择
- 3.5 设置/取消索引
- 3.6 重置索引
- 3.6.1 前向填充
- 3.6.2 后向填充
- 3.7 多重索引
- 四、重复数据
- 五、数据分组
- 5.1 聚合
- 5.2 转换
- 六、缺失值
- 七、合并数据
- 7.1 合并-Merge
- 7.2 连接-Join
- 7.3 拼接-Concatenate
- 7.3.1 纵向拼接
- 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 的相应位置上。
即 将行变为列 ,我们可以这么实现代码:
>>> 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 中的值按照指定的行和列进行聚合。
即 将行变为列,我们可以这么实现:
>>> 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 中透视行和列标签。
>>> stacked = df5.stack()
# 透视列标签
# 使用 stack() 函数将列标签透视,即将列标签转换为行索引,并将相应的数据堆叠起来。这样可以创建一个具有多级索引的 Series
>>> stacked.unstack()
# 透视索引标签
# 上述代码则使用 unstack() 函数将索引标签透视,即将行索引转换为列标签,并将相应的数据重新排列。这样可以还原出原始的 DataFrame 结构
1.3 融合
我们需要 将指定的列转换为一个观察值列时,可以使用 pd.melt() 函数来将一个 DataFrame 进行融合操作(melt)。
将列转为行:
>>> 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。它返回一个生成器,每次迭代生成一个包含行索引和对应行的序列的键值对。
>>> df.iteritems()
# (列索引,序列)键值对
>>> df.iterrows()
# (行索引,序列)键值对
下面是一些基本操作:
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 中基于条件选择列的操作如下,都是一些基本的操作:
>>> 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 的进一步选择和筛选操作。
>>> df[(df.Country.isin(df2.Type))]
# 选择为某一类型的数值
>>> df3.filter(items=”a”,”b”])
# 选择特定值
>>> df.select(lambda x: not x%5)
# 选择指定元素
3.3 通过Where选择
where()是Pandas Series对象中的一个方法,也可以用于选择满足条件的子集。
>>> s.where(s > 0)
# 选择子集
3.4 通过Query选择
>>> df6.query('second > first')
# 查询DataFrame
df6.query(‘second > first’) 是 DataFrame 对象中的一个查询操作,查询 DataFrame df6 中满足条件 “second > first” 的行。其中,“second” 和 “first” 是列名,表示要比较的两个列。只有满足条件的行会被选中并返回为一个新的 DataFrame。
3.5 设置/取消索引
>>> 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(缺失值)。
>>> s2 = s.reindex(['a','c','d','e','b'])
3.6.1 前向填充
>>> 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 后向填充
>>> s3 = s.reindex(range(5), method='bfill')
0 3
1 3
2 3
3 3
4 3
3.7 多重索引
>>> 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"])
四、重复数据
>>> s3.unique()
# 返回唯一值
>>> df2.duplicated('Type')
# 查找重复值
>>> df2.drop_duplicates('Type', keep='last')
# 去除重复值
>>> df.index.duplicated()
# 查找重复索引
五、数据分组
5.1 聚合
>>> 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 转换
>>> customSum = lambda x: (x+x%2)
>>> df4.groupby(level=0).transform(customSum)
六、缺失值
>>> df.dropna()
# 去除缺失值NaN
>>> df3.fillna(df3.mean())
# 用预设值填充缺失值NaN
>>> df2.replace("a", "f")
# 用一个值替换另一个值
七、合并数据
7.1 合并-Merge
>>> pd.merge(data1, data2, how='left', on='X1')
将 data1 和 data2 两个 DataFrame 按照它们的 ‘X1’ 列进行左连接,并返回一个新的 DataFrame。左连接保留 data1 的所有行,并将 data2 中符合条件的行合并到 data1 中。如果 data2 中没有与 data1 匹配的行,则对应的列值将被设置为 NaN(缺失值)。
>>> pd.merge(data1, data2, how='right', on='X1')
右连接也是一种连接方式,其将 data1 和 data2 两个 DataFrame 按照它们的 ‘X1’ 列进行右连接,并返回一个新的 DataFrame。保留 data2 的所有行,并将 data1 中符合条件的行合并到 data2 中。如果 data1 中没有与 data2 匹配的行,则对应的列值将被设置为 NaN(缺失值)。
>>> 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’ 列作为合并键(即共同的列)。
>>> pd.merge(data1, data2, how='outer',on='X1')
将 data1 和 data2 两个 DataFrame 按照它们的 ‘X1’ 列进行外连接,并返回一个新的 DataFrame。外连接(outer join)是一种合并方式,它会保留 data1 和 data2 中所有的行,并将它们根据 ‘X1’ 列的值进行合并。
在外连接中,如果某个 DataFrame 中的行在另一个 DataFrame 中找不到匹配,那么对应的列值将被设置为 NaN(缺失值),表示缺失的数据。
7.2 连接-Join
>>> data1.join(data2, how='right')
7.3 拼接-Concatenate
7.3.1 纵向拼接
>>> s.append(s2)
7.3.2 横向/纵向拼接
>>> pd.concat([s,s2],axis=1, keys=['One','Two'])
>>> pd.concat([data1, data2], axis=1, join='inner')
八、日期
>>> 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 的函数和方法,以便创建和修改图形了。
>>> import matplotlib.pyplot as plt
现在,我们试试导入 Matplotlib 库使用 Pandas 库中 Series 对象的 .plot() 方法 和 Matplotlib 库中的 plt.show() 函数 来生成并显示数据的默认图形。
>>> s.plot()
>>> plt.show()
我们也可使用 Pandas 库中 DataFrame 对象的 .plot() 方法 和 Matplotlib 库 中的 plt.show() 函数 来生成并显示数据的默认图形。
>>> df2.plot()
>>> plt.show()