MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python结合NumPy和Pandas进行数据处理

2023-10-166.5k 阅读

Python 结合 NumPy 和 Pandas 进行数据处理

NumPy 基础

NumPy 是 Python 中用于数值计算的核心库,它提供了高性能的多维数组对象以及用于处理这些数组的工具。

NumPy 数组

  1. 创建数组
    • 使用 numpy.array:最基本的创建 NumPy 数组的方式是使用 numpy.array 函数。它可以将 Python 的列表或元组转换为 NumPy 数组。
    import numpy as np
    my_list = [1, 2, 3]
    arr = np.array(my_list)
    print(arr)
    
    • 使用特定函数创建数组
      • np.zeros:创建一个全零的数组。
      zero_arr = np.zeros((3, 3))
      print(zero_arr)
      
      • np.ones:创建一个全一的数组。
      one_arr = np.ones((2, 4))
      print(one_arr)
      
      • np.arange:类似于 Python 的 range 函数,但返回的是 NumPy 数组。
      arange_arr = np.arange(0, 10, 2)
      print(arange_arr)
      
  2. 数组属性
    • ndim:获取数组的维度。
    arr_2d = np.array([[1, 2], [3, 4]])
    print(arr_2d.ndim)
    
    • shape:返回一个表示数组各维度大小的元组。
    print(arr_2d.shape)
    
    • dtype:获取数组中元素的数据类型。
    print(arr_2d.dtype)
    

数组运算

  1. 算术运算
    • NumPy 数组支持基本的算术运算,这些运算会对数组中的每个元素进行操作。
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([4, 5, 6])
    add_result = arr1 + arr2
    sub_result = arr1 - arr2
    mul_result = arr1 * arr2
    div_result = arr1 / arr2
    print(add_result)
    print(sub_result)
    print(mul_result)
    print(div_result)
    
  2. 矩阵运算
    • 矩阵乘法:使用 np.dot 函数或 @ 运算符进行矩阵乘法。
    mat1 = np.array([[1, 2], [3, 4]])
    mat2 = np.array([[5, 6], [7, 8]])
    dot_result = np.dot(mat1, mat2)
    at_result = mat1 @ mat2
    print(dot_result)
    print(at_result)
    

NumPy 高级操作

索引与切片

  1. 一维数组
    • 与 Python 列表类似,NumPy 一维数组可以通过索引访问元素,索引从 0 开始。
    arr = np.arange(10)
    print(arr[3])
    
    • 切片操作也类似,arr[start:stop:step]
    print(arr[2:6:2])
    
  2. 多维数组
    • 对于二维数组,需要使用逗号分隔的索引来访问元素。
    arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(arr_2d[1, 2])
    
    • 切片时,对每个维度分别进行切片操作。
    print(arr_2d[1:, 1:])
    

数组变形

  1. reshape:可以改变数组的形状,前提是元素总数不变。
    arr = np.arange(12)
    new_arr = arr.reshape(3, 4)
    print(new_arr)
    
  2. flatten:将多维数组展平为一维数组。
    flat_arr = new_arr.flatten()
    print(flat_arr)
    

聚合操作

  1. 求和:使用 np.sum 函数。
    arr = np.array([1, 2, 3, 4])
    sum_result = np.sum(arr)
    print(sum_result)
    
    • 对于多维数组,可以指定轴进行求和。
    arr_2d = np.array([[1, 2], [3, 4]])
    sum_axis0 = np.sum(arr_2d, axis = 0)
    sum_axis1 = np.sum(arr_2d, axis = 1)
    print(sum_axis0)
    print(sum_axis1)
    
  2. 求均值:使用 np.mean 函数。
    mean_result = np.mean(arr)
    print(mean_result)
    
    • 同样可以指定轴求均值。
    mean_axis0 = np.mean(arr_2d, axis = 0)
    mean_axis1 = np.mean(arr_2d, axis = 1)
    print(mean_axis0)
    print(mean_axis1)
    

Pandas 基础

Pandas 是用于数据处理和分析的强大库,它基于 NumPy 构建,提供了灵活的数据结构和数据分析工具。

Pandas 数据结构

  1. Series
    • Series 是一种一维标记数组,可包含任何数据类型(整数、字符串、浮点数等)。
    import pandas as pd
    data = [10, 20, 30]
    index = ['a', 'b', 'c']
    s = pd.Series(data, index = index)
    print(s)
    
    • 可以通过索引访问 Series 中的元素。
    print(s['b'])
    
  2. DataFrame
    • DataFrame 是一种二维表格型数据结构,类似于电子表格或 SQL 表。它由行索引、列索引和数据组成。
    data = {
        'col1': [1, 2, 3],
        'col2': [4, 5, 6]
    }
    df = pd.DataFrame(data)
    print(df)
    
    • 可以通过列名访问列数据。
    print(df['col1'])
    

数据读取与写入

  1. 读取数据
    • 读取 CSV 文件:使用 pd.read_csv 函数。
    df = pd.read_csv('data.csv')
    print(df.head())
    
    • 读取 Excel 文件:使用 pd.read_excel 函数。
    df = pd.read_excel('data.xlsx')
    print(df.head())
    
  2. 写入数据
    • 写入 CSV 文件:使用 to_csv 方法。
    df.to_csv('new_data.csv', index = False)
    
    • 写入 Excel 文件:使用 to_excel 方法。
    df.to_excel('new_data.xlsx', index = False)
    

数据清洗

  1. 处理缺失值
    • 检测缺失值:使用 isnullnotnull 方法。
    df = pd.DataFrame({'col1': [1, None, 3]})
    print(df.isnull())
    
    • 删除缺失值:使用 dropna 方法。
    new_df = df.dropna()
    print(new_df)
    
    • 填充缺失值:使用 fillna 方法。
    filled_df = df.fillna(0)
    print(filled_df)
    
  2. 处理重复值
    • 检测重复值:使用 duplicated 方法。
    df = pd.DataFrame({'col1': [1, 1, 2]})
    print(df.duplicated())
    
    • 删除重复值:使用 drop_duplicates 方法。
    new_df = df.drop_duplicates()
    print(new_df)
    

Python 结合 NumPy 和 Pandas 进行复杂数据处理

数据转换

  1. 使用 NumPy 进行数据转换
    • 假设我们有一个 DataFrame,需要对其中某一列进行数学运算,并且利用 NumPy 的向量化运算来提高效率。
    import pandas as pd
    import numpy as np
    df = pd.DataFrame({'col1': [1, 2, 3]})
    df['col2'] = np.sqrt(df['col1'])
    print(df)
    
  2. 使用 Pandas 进行数据转换
    • 数据映射:使用 map 方法对 Series 中的值进行映射。
    df = pd.DataFrame({'col1': ['a', 'b', 'a']})
    mapping = {'a': 1, 'b': 2}
    df['col2'] = df['col1'].map(mapping)
    print(df)
    
    • 数据分组与聚合:使用 groupby 方法。
    df = pd.DataFrame({
        'category': ['A', 'A', 'B'],
        'value': [1, 2, 3]
    })
    grouped = df.groupby('category').sum()
    print(grouped)
    

数据合并与连接

  1. 使用 Pandas 进行合并
    • merge:类似于 SQL 的 JOIN 操作。
    df1 = pd.DataFrame({
        'key': ['a', 'b', 'c'],
        'value1': [1, 2, 3]
    })
    df2 = pd.DataFrame({
        'key': ['a', 'b', 'd'],
        'value2': [4, 5, 6]
    })
    merged = pd.merge(df1, df2, on = 'key', how = 'outer')
    print(merged)
    
  2. 使用 Pandas 进行连接
    • concat:可以沿着指定轴连接 SeriesDataFrame
    s1 = pd.Series([1, 2])
    s2 = pd.Series([3, 4])
    concatenated = pd.concat([s1, s2])
    print(concatenated)
    

高级数据分析

  1. 使用 NumPy 和 Pandas 进行统计分析
    • 计算数据的相关性。
    import pandas as pd
    import numpy as np
    df = pd.DataFrame({
        'col1': np.random.randn(100),
        'col2': np.random.randn(100)
    })
    correlation = df['col1'].corr(df['col2'])
    print(correlation)
    
  2. 使用 Pandas 进行时间序列分析
    • 时间序列数据创建
    import pandas as pd
    date_rng = pd.date_range(start = '1/1/2020', end = '1/10/2020', freq = 'D')
    df = pd.DataFrame(date_rng, columns = ['date'])
    df['data'] = np.random.randn(len(date_rng))
    print(df)
    
    • 时间序列数据重采样
    df.set_index('date', inplace = True)
    resampled = df.resample('3D').mean()
    print(resampled)
    

案例分析

假设我们有一个销售数据集,包含产品名称、销售日期、销售量和销售额等信息。我们的目标是分析不同产品的销售趋势,找出畅销产品,并计算每月的平均销售额。

  1. 数据读取与清洗
    import pandas as pd
    import numpy as np
    sales_data = pd.read_csv('sales_data.csv')
    # 处理缺失值
    sales_data = sales_data.dropna()
    # 处理重复值
    sales_data = sales_data.drop_duplicates()
    
  2. 数据转换与分析
    • 将销售日期转换为日期类型
    sales_data['sale_date'] = pd.to_datetime(sales_data['sale_date'])
    
    • 按产品分组计算总销售量和总销售额
    product_summary = sales_data.groupby('product_name').agg({'quantity':'sum','revenue':'sum'}).reset_index()
    
    • 按月份计算平均销售额
    sales_data['month'] = sales_data['sale_date'].dt.to_period('M')
    monthly_avg_revenue = sales_data.groupby('month').agg({'revenue':'mean'}).reset_index()
    

通过以上步骤,我们可以利用 Python 的 NumPy 和 Pandas 库对复杂的销售数据进行有效的处理和分析,从而为业务决策提供有价值的信息。无论是简单的数据清洗,还是复杂的统计分析和时间序列处理,NumPy 和 Pandas 都提供了丰富的功能和方法来满足我们的需求。在实际应用中,根据具体的数据特点和分析目标,灵活运用这些工具,能够高效地完成数据处理任务。

同时,NumPy 和 Pandas 还可以与其他数据科学库如 Matplotlib(用于数据可视化)、Scikit - learn(用于机器学习)等结合使用,进一步拓展数据处理和分析的能力。例如,我们可以将分析得到的数据结果通过 Matplotlib 绘制成图表,更直观地展示数据趋势和关系。在机器学习领域,NumPy 数组和 Pandas 的 DataFrame 是常用的数据输入格式,为模型训练和评估提供基础数据支持。

在处理大规模数据时,还需要注意内存管理和性能优化。例如,Pandas 在处理大型数据集时可能会占用大量内存,可以考虑使用 chunksize 参数分块读取数据,或者使用更适合大数据处理的工具如 Dask,它与 Pandas 和 NumPy 的 API 高度兼容,能够在分布式环境下高效处理海量数据。

总之,NumPy 和 Pandas 是 Python 数据处理领域的核心工具,熟练掌握它们的使用方法对于数据分析师、数据科学家和机器学习工程师来说至关重要。通过不断实践和探索,结合实际项目需求,能够充分发挥它们的强大功能,解决各种复杂的数据处理问题。