Python数据分析pandas模块用法实例详解

  • Post category:Python

Python数据分析pandas模块用法实例详解

简介

pandas是一个开源的数据分析库,在数据清洗、数据处理和数据分析中广泛应用。它提供了一种高效、快速、灵活和易于使用的数据结构,使得数据分析和数据操作变得非常方便。

本文将详细介绍pandas模块用法,并配合实例演示它的常用函数和功能。文章内容包含以下几个部分:

  • 数据结构介绍
  • 数据选择和过滤
  • 数据清洗和重构
  • 数据合并和重塑
  • 数据分组和聚合
  • 时间序列数据分析

数据结构介绍

pandas提供了两种主要的数据结构:SeriesDataFrame

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提供了TimestampDatetimeIndexPeriodPeriodIndex等函数和类来处理时间序列数据。

我们可以使用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()