Python数据分析pandas模块用法实例详解
简介
pandas
是一个开源的数据分析库,在数据清洗、数据处理和数据分析中广泛应用。它提供了一种高效、快速、灵活和易于使用的数据结构,使得数据分析和数据操作变得非常方便。
本文将详细介绍pandas模块用法,并配合实例演示它的常用函数和功能。文章内容包含以下几个部分:
- 数据结构介绍
- 数据选择和过滤
- 数据清洗和重构
- 数据合并和重塑
- 数据分组和聚合
- 时间序列数据分析
数据结构介绍
pandas
提供了两种主要的数据结构:Series
和DataFrame
。
Series
Series
是一种一维的数据结构,它类似于Python中的列表或数组。它可以保存各种数据类型,如整数、浮点数、字符串、字典、甚至是其他的Series等。Series的基本语法如下:
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5])
print(s)
输出结果为:
0 1
1 2
2 3
3 4
4 5
dtype: int64
DataFrame
DataFrame
是一种二维的数据结构,它可以看作是由Series构成的字典。每列都可以是不同的数据类型(整数、浮点数、字符串等),并且可以使用行和列的标签来操作数据。DataFrame的基本语法如下:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
print(df)
输出结果为:
A B C
0 1 4 7
1 2 5 8
2 3 6 9
数据选择和过滤
在数据分析中,我们经常需要根据某些条件来选择和过滤数据。pandas
提供了丰富而强大的选择和过滤数据的方法,这里只介绍其中的几种常用方法:使用布尔值进行过滤、使用位置进行选择和使用标签进行选择。
使用布尔值进行过滤
我们可以使用布尔值来过滤数据,只保留符合条件的行或列。例如,我们可以筛选出DataFrame中A列大于1的所有行:
df[df['A'] > 1]
使用位置进行选择
使用位置选择数据时,我们可以按照坐标来选择行或列。例如,选择DataFrame中的第一行数据:
df.iloc[0]
使用标签进行选择
使用标签选择数据时,我们可以按照行和列的标签来选择数据。例如,选择DataFrame中的A列和B列:
df.loc[:, ['A', 'B']]
数据清洗和重构
在数据分析中,数据清洗和重构是必不可少的环节。pandas
提供了很多数据清洗和重构的函数,这里介绍其中的几个。
处理缺失值
在实际数据中,我们经常会遇到缺失值。pandas
提供了一些函数,如dropna()
和fillna()
,来处理缺失值。
dropna()
函数可以删除有缺失值的行或列。fillna()
函数可以用指定的值或插值方法来填充缺失值。
下面是一个假设有缺失值的DataFrame的例子:
import numpy as np
import pandas as pd
df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, np.nan], 'C': [7, 8, 9]})
如果我们想删除有缺失值的行,可以使用以下代码:
df.dropna()
如果我们想用平均值来填充缺失的数据,可以使用以下代码:
df.fillna(df.mean())
数据重构
对于一些需要重新处理的数据,我们可以使用melt()
、pivot()
和pivot_table()
函数来进行数据重构。
melt()
函数可以将宽格式的数据变为长格式的数据。pivot()
函数可以将长格式的数据转换为宽格式的数据,但只支持单个值列。pivot_table()
函数是功能最全面的重塑函数,可以将长格式或宽格式的数据进行转换。
下面是一个使用melt()
函数的例子:
df = pd.DataFrame({'A': ['foo', 'bar', 'baz'], 'B': [1, 2, 3], 'C': [4, 5, 6]})
pd.melt(df, id_vars=['A'], value_vars=['B', 'C'], var_name='variable', value_name='value')
输出结果为:
A variable value
0 foo B 1
1 bar B 2
2 baz B 3
3 foo C 4
4 bar C 5
5 baz C 6
数据合并和重塑
在数据分析中,我们通常需要将多个数据源合并成一个数据集,或者将一个数据集拆分成多个。pandas
提供了merge()
和concat()
函数来进行数据合并,以及stack()
和unstack()
函数来进行数据重塑。
数据合并
merge()
函数可以根据给定的键将两个DataFrame进行合并。例如,对以下两个DataFrame进行内连接:
df1 = pd.DataFrame({'key': ['foo', 'bar', 'baz', 'qux'], 'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['foo', 'bar', 'baz', 'qux'], 'value': [5, 6, 7, 8]})
pd.merge(df1, df2, on='key')
输出结果为:
key value_x value_y
0 foo 1 5
1 bar 2 6
2 baz 3 7
3 qux 4 8
数据重塑
数据重塑通常指的是行列转换。stack()
函数可以将列索引转换为行索引,而unstack()
函数可以将行索引转换为列索引。
例如,对以下DataFrame进行stack操作:
df = pd.DataFrame({'A': ['one', 'one', 'two', 'two'], 'B': ['A', 'B', 'A', 'B'], 'C': [1, 2, 3, 4], 'D': [5, 6, 7, 8]})
df.set_index(['A', 'B']).stack()
输出结果为:
A B
one A C 1
D 5
B C 2
D 6
two A C 3
D 7
B C 4
D 8
dtype: int64
数据分组和聚合
pandas
提供了groupby()
和agg()
函数来进行数据分组和聚合。
数据分组
groupby()
函数可以将数据按照某些条件进行分组。例如,对以下数据进行分组:
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C': np.random.randn(8), 'D': np.random.randn(8)})
df.groupby('A').sum()
输出结果为:
C D
A
bar 0.557851 0.807683
foo 2.843490 0.144288
数据聚合
在数据分组之后,我们通常需要使用一些聚合函数来对数据进行聚合,在pandas
中,可以使用agg()
函数来实现聚合操作。例如,对以下数据按照A列进行分组,并求出每组的平均值和标准差:
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C': np.random.randn(8), 'D': np.random.randn(8)})
df.groupby('A').agg([np.mean, np.std])
输出结果为:
C D
mean std mean std
A
bar -0.212692 1.045012 0.322561 0.989474
foo 0.679386 0.496275 0.189461 0.664414
时间序列数据分析
在很多数据分析中,我们需要处理时间序列数据。pandas
提供了Timestamp
、DatetimeIndex
、Period
和PeriodIndex
等函数和类来处理时间序列数据。
我们可以使用to_datetime()
函数将字符串转换为时间戳,例如:
import pandas as pd
s = pd.Series(['2018-01-01', '2018-01-02', '2018-01-03'])
pd.to_datetime(s)
输出结果为:
0 2018-01-01
1 2018-01-02
2 2018-01-03
dtype: datetime64[ns]
我们可以使用resample()
函数进行时间序列重采样,例如:
import pandas as pd
idx = pd.date_range(start='2018-01-01', end='2018-12-31', freq='D')
s = pd.Series(range(len(idx)), index=idx)
weekly_mean = s.resample('W').mean()
以上代码将每天的数据进行了重采样,将其转换为每周的数据,并求出周平均数。
示例说明
下面以人口数据为例进行演示:
import pandas as pd
df = pd.DataFrame({'Province': ['广东', '广东', '广东', '四川', '四川', '四川'], 'Year': [2010, 2015, 2020, 2010, 2015, 2020], 'Population': [9728, 10724, 11940, 8042, 8767, 9383]})
选择列数据
选择Province列数据:
df['Province']
输出结果为:
0 广东
1 广东
2 广东
3 四川
4 四川
5 四川
Name: Province, dtype: object
过滤数据
筛选出2020年的数据:
df[df['Year'] == 2020]
输出结果为:
Province Year Population
2 广东 2020 11940
5 四川 2020 9383
分组聚合
按照Province列进行分组,并对Population列求和:
df.groupby('Province')['Population'].sum()
输出结果为:
Province
广东 32492
四川 26192
Name: Population, dtype: int64
时间序列数据分析
生成从2010年到2020年的日期索引序列:
import pandas as pd
idx = pd.date_range(start='2010-01-01', end='2020-01-01', freq='AS')
df = pd.DataFrame({'Year': [x.year for x in idx], 'Population': [9728, 10724, 11940, 8042, 8767, 9383, 9931, 10430, 10948, 11346, 11712]})
以上代码将每年的人口数据转换为每个年度的数据,并生成了一个时间索引。我们可以使用以下代码计算每个年度的增长率:
df['Growth'] = df['Population'].pct_change()
最后,我们可以使用plot()
函数将每个年度的增长率进行可视化:
import matplotlib.pyplot as plt
plt.plot(df['Year'], df['Growth'])
plt.show()