20个案例进阶Pandas数据分析

Pandas是Python 数据科学领域最受欢迎的库之一,它提供了高效且灵活的数据结构,使得数据分析变得便利。本文将通过多个案例带大家进一步熟悉Pandas。

在开始之前,请确保您已安装 Pandas 库。您可以使用 pip 进行安装:

pip install pandas

一、数据聚合与分组运算

案例一:apply() 函数

apply() 函数可以将自定义函数应用于 DataFrame 的每一行或每一列。

数据:

import pandas as pd

data = {'Name': ['Alice''Bob''Charlie''David'],
        'Age': [25302835],
        'City': ['New York''London''Paris''Tokyo']}
df = pd.DataFrame(data)

代码:

# 定义一个函数,将年龄加5
def add_five(age):
  return age + 5

# 使用apply()函数将add_five函数应用于'Age'列
df['Age_Plus_Five'] = df['Age'].apply(add_five)

print(df)

输出:

注释:

  • 定义了一个名为 add_five 的函数,它接受年龄值为输入,返回加 5 的结果。
  • 使用 apply() 函数将 add_five 函数应用于 df DataFrame 的 'Age' 列。
  • apply() 函数会自动将 'Age' 列中的每个值传递给 add_five 函数,并将返回值存储在一个新的 Series 中。
  • 最后,我们将新的 Series 分配给 df DataFrame 的新列 'Age_Plus_Five'

案例二:groupby() 函数

groupby() 函数可以根据一个或多个列对数据进行分组,然后对每个组应用聚合函数。

数据:

import pandas as pd

data = {'Name': ['Alice''Bob''Charlie''David''Emily'],
        'Gender': ['F''M''M''M''F'],
        'Score': [8075908595]}
df = pd.DataFrame(data)

代码:

# 根据'Gender'列对数据进行分组,并计算每个性别的平均分数
grouped_df = df.groupby('Gender')['Score'].mean()

print(grouped_df)

输出:

Gender
F    87.5
M    83.33333333333333
Name: Score, dtype: float64

注释:

  • groupby('Gender') 根据 'Gender' 列对数据进行分组,创建一个 DataFrameGroupBy 对象。
  • ['Score'] 选择 'Score' 列聚合。
  • mean() 计算每个组的平均分数。

案例三:agg() 函数

agg() 函数可以对分组后的数据应用多个聚合函数。

数据: 使用案例二的数据

代码:

# 对每个性别分组计算分数的平均值、最大值和最小值
grouped_df = df.groupby('Gender')['Score'].agg(['mean''max''min'])

print(grouped_df)

输出:

注释:

  • agg(['mean', 'max', 'min'])  应用多个聚合函数,并以列表形式传递给 agg() 函数。

案例四:transform() 函数

transform() 函数对分组后的数据应用函数,并返回与原始 DataFrame 相同大小的结果。

数据: 使用案例二的数据

代码:

# 计算每个学生相对于其性别平均分数的偏差
df['Score_Deviation'] = df.groupby('Gender')['Score'].transform(lambda x: x - x.mean())

print(df)

输出:

注释:

  • transform(lambda x: x - x.mean())  使用匿名函数计算每个值与其组平均值之间的差值。

二、数据透视与重塑

案例五:pivot_table() 函数

pivot_table() 函数可以根据一个或多个列创建数据透视表。

数据:

import pandas as pd

data = {'Date': ['2023-04-01''2023-04-01''2023-04-02''2023-04-02''2023-04-03'],
        'City': ['New York''London''London''Paris''Paris'],
        'Sales': [100150200180250]}
df = pd.DataFrame(data)

代码:

# 创建一个数据透视表,以'Date'作为索引,'City'作为列,'Sales'作为值
pivot_table = df.pivot_table(index='Date', columns='City', values='Sales')

print(pivot_table)

输出:

注释:

  • index='Date' 指定 'Date' 列作为数据透视表的索引。
  • columns='City' 指定 'City' 列作为数据透视表的列。
  • values='Sales' 指定 'Sales' 列作为数据透视表的值。

案例六:pivot() 函数

pivot() 函数与 pivot_table() 函数类似,但它不允许对数据进行聚合。

数据: 使用案例五的数据

代码:

# 使用pivot()函数创建数据透视表
pivot_table = df.pivot(index='Date', columns='City', values='Sales')

print(pivot_table)

输出:

注释:

  • pivot() 函数的参数与 pivot_table() 函数相同。

案例七:stack() 函数

stack() 函数可以将 DataFrame 的列索引转换为行索引,从而将数据“堆叠”起来。

数据: 使用案例五的数据透视表结果

代码:

# 将数据透视表堆叠起来
stacked_df = pivot_table.stack()

print(stacked_df)

输出:

注释:

  • stack() 函数将列索引 'City' 转换为行索引,并将值存储在对应的索引位置。

案例八:unstack() 函数

unstack() 函数可以将 DataFrame 的行索引转换为列索引,从而将数据“展开”。

数据: 使用案例七的堆叠后的 DataFrame

代码:

# 将堆叠后的DataFrame展开
unstacked_df = stacked_df.unstack()

print(unstacked_df)

输出:

注释:

  • unstack() 函数将行索引 'City' 转换为列索引,并将值存储在对应的索引位置。

案例九:melt() 函数

melt() 函数可以将 DataFrame 从“宽格式”转换为“长格式”。

数据: 使用案例五的数据

代码:

# 将DataFrame从宽格式转换为长格式
melted_df = df.melt(id_vars=['Date''City'], value_vars=['Sales'], var_name='Metric', value_name='Value')

print(melted_df)

输出:

注释:

  • id_vars=['Date', 'City'] 指定要保留为标识变量的列。
  • value_vars=['Sales'] 指定要处理为变量的列。
  • var_name='Metric' 指定新创建的变量名称列的名称。
  • value_name='Value' 指定新创建的列的名称。

三、数据合并与连接

案例十:merge() 函数

merge() 函数可以根据一个或多个键将两个 DataFrame 合并成一个。

数据:

import pandas as pd

data1 = {'CustomerID': [1234],
         'Name': ['Alice''Bob''Charlie''David']}
df1 = pd.DataFrame(data1)

data2 = {'CustomerID': [235],
         'City': ['London''Paris''Tokyo']}
df2 = pd.DataFrame(data2)

代码:

# 根据'CustomerID'列合并两个DataFrame
merged_df = pd.merge(df1, df2, on='CustomerID')

print(merged_df)

输出:

注释:

  • on='CustomerID' 指定 'CustomerID' 列作为合并的键。

案例十一:concat() 函数

concat() 函数可以将多个 DataFrame 连接成一个。

数据:

import pandas as pd

data1 = {'Name': ['Alice''Bob'],
         'Age': [2530]}
df1 = pd.DataFrame(data1)

data2 = {'Name': ['Charlie''David'],
         'Age': [2835]}
df2 = pd.DataFrame(data2)

代码:

# 将两个DataFrame垂直连接
concatenated_df = pd.concat([df1, df2])

print(concatenated_df)

输出:

      Name  Age
0    Alice   25
1      Bob   30
0  Charlie   28
1    David   35

注释:

  • [df1, df2] 是一个包含要连接的 DataFrame 的列表。

案例十二:join() 函数

join() 函数可以根据索引将两个 DataFrame 合并成一个。

数据:

import pandas as pd

data1 = {'Name': ['Alice''Bob''Charlie'],
         'Age': [253028]}
df1 = pd.DataFrame(data1, index=[123])

data2 = {'City': ['London''Paris'],
         'Score': [8090]}
df2 = pd.DataFrame(data2, index=[23])

代码:

# 根据索引合并两个DataFrame
joined_df = df1.join(df2)

print(joined_df)

输出:

注释:

  • join() 函数默认使用左连接,即保留左侧 DataFrame 的所有行。

四、时间序列处理

案例十三:resample() 函数

resample() 函数可以对时间序列数据进行重采样。

数据:

import pandas as pd

data = {'Date': pd.to_datetime(['2023-04-01''2023-04-02''2023-04-03''2023-04-04''2023-04-05']),
        'Sales': [100150200180250]}
df = pd.DataFrame(data)
df = df.set_index('Date')

代码:

# 将数据重采样为每周的总销售额
resampled_df = df.resample('W')['Sales'].sum()

print(resampled_df)

输出:

Date
2023-04-02    250
2023-04-09    530
Freq: W-SUN, Name: Sales, dtype: int64

注释:

  • 'W' 指定重采样的频率为每周。
  • ['Sales'] 选择 'Sales' 列进行聚合操作。
  • sum() 计算每周的总销售额。

案例十四:shift() 函数

shift() 函数可以将数据向上或向下移动指定的位数。

数据:

import pandas as pd

data = {'Sales': [100150200180250]}
df = pd.DataFrame(data)

代码:

# 将'Sales'列向下移动一位
df['Previous_Sales'] = df['Sales'].shift(1)

print(df)

输出:

   Sales  Previous_Sales
0    100             NaN
1    150           100.0
2    200           150.0
3    180           200.0
4    250           180.0

注释:

  • 1 指定向下移动一位。

案例十五:rolling() 函数

rolling() 函数可以创建一个指定大小的滚动窗口,并对窗口内的数据应用聚合函数。

数据:

import pandas as pd

data = {'Sales': [100150200180250]}
df = pd.DataFrame(data)

代码:

# 创建一个大小为3的滚动窗口,并计算窗口内的平均值
df['Rolling_Mean'] = df['Sales'].rolling(3).mean()

print(df)

输出:

   Sales  Rolling_Mean
0    100           NaN
1    150           NaN
2    200     150.000000
3    180     176.666667
4    250     210.000000

注释:

  • 3 指定滚动窗口的大小。
  • mean() 计算窗口内的平均值。

案例十六:diff() 函数

diff() 函数可以计算时间序列数据的一阶差分。

数据: 使用案例十四的数据

代码:

# 计算'Sales'列的一阶差分
df['Sales_Diff'] = df['Sales'].diff()

print(df)

输出:

   Sales  Sales_Diff
0    100         NaN
1    150        50.0
2    200        50.0
3    180       -20.0
4    250        70.0

注释:

  • diff() 函数默认计算当前值与前一个值之间的差值。

五、缺失值处理

案例十七:fillna() 函数

fillna() 函数可以填充缺失值。

数据:

import pandas as pd

data = {'Sales': [100150None180None]}
df = pd.DataFrame(data)

代码:

# 使用前一个非缺失值填充缺失值
df['Sales_Filled'] = df['Sales'].fillna(method='ffill')

print(df)

输出:

   Sales  Sales_Filled
0  100.0        100.0
1  150.0        150.0
2    NaN        150.0
3  180.0        180.0
4    NaN        180.0

注释:

  • method='ffill' 指定使用前一个非缺失值填充缺失值。

案例十八:dropna() 函数

dropna() 函数可以删除包含缺失值的行或列。

数据: 使用案例十七的数据

代码:

# 删除包含缺失值的行
df_dropped = df.dropna()

print(df_dropped)

输出:

   Sales
0  100.0
1  150.0
3  180.0

注释:

  • 默认情况下,dropna() 函数会删除包含缺失值的行。

案例十九:interpolate() 函数

interpolate() 函数可以使用插值法填充缺失值。

数据: 使用案例十七的数据

代码:

# 使用线性插值法填充缺失值
df['Sales_Interpolated'] = df['Sales'].interpolate(method='linear')

print(df)

输出:

   Sales  Sales_Interpolated
0  100.0              100.0
1  150.0              150.0
2    NaN              165.0
3  180.0              180.0
4    NaN              180.0

注释:

  • method='linear' 指定使用线性插值法填充缺失值。

案例二十:replace() 函数

replace() 函数可以将特定值替换为其他值。

数据: 使用案例十七的数据

代码:

# 将缺失值替换为0
df['Sales_Replaced'] = df['Sales'].replace(np.nan, 0)

print(df)

输出:

   Sales  Sales_Replaced
0  100.0          100.0
1  150.0          150.0
2    NaN            0.0
3  180.0          180.0
4    NaN            0.0

注释:

  • replace(np.nan, 0)NaN 值替换为 0


本文介绍了Pandas的一些高级函数的用法的案例,希望这些案例能够帮助大家更好地理解和使用Pandas进行数据分析。


请使用浏览器的分享功能分享到微信等