Pandas `DataFrame`:二维表格数据结构深度解析

好的,各位观众老爷,各位技术达人们,欢迎来到今天的“Pandas DataFrame深度游”节目!我是你们的老朋友,编程界的段子手,代码界的诗人——数据挖掘小王子!今天,咱们就来聊聊Pandas库中的扛把子,DataFrame这个二维表格数据结构。

准备好了吗?系好安全带,让我们一起踏上这段奇妙的旅程!🚀

一、DataFrame:数据界的“变形金刚”

话说,在数据世界里,数据格式那是五花八门,有文本、有JSON、有XML,还有各种奇奇怪怪的二进制格式。想要把这些数据玩转起来,可不是件容易的事。这时候,Pandas就带着DataFrame这个“变形金刚”闪亮登场了!

DataFrame,顾名思义,就是“数据框”。它就像一个Excel表格,拥有行和列,可以存放各种类型的数据(数字、字符串、布尔值,甚至还能放Python对象!)。更重要的是,它还拥有强大的数据处理能力,可以进行筛选、排序、分组、聚合等等操作。简直就是数据分析师的瑞士军刀!🔪

你可以把DataFrame想象成一个豪华版、功能更强大的电子表格。Excel能做的,DataFrame基本上也能做,而且做得更快、更灵活!Excel不能做的,DataFrame也能轻松搞定!😎

二、DataFrame的“七十二变”:创建方式大盘点

想要拥有一个DataFrame,方法可是多种多样,就像孙悟空的七十二变一样。下面,我就给大家盘点一下DataFrame的常见创建方式:

  1. 字典大法:从字典创建DataFrame

    这是最常见,也是最简单的一种方式。我们可以用一个字典来定义DataFrame的列名和数据。字典的key就是列名,value就是该列的数据(列表或NumPy数组)。

    import pandas as pd
    
    data = {'姓名': ['张三', '李四', '王五'],
            '年龄': [25, 30, 28],
            '城市': ['北京', '上海', '广州']}
    
    df = pd.DataFrame(data)
    print(df)

    输出结果:

       姓名  年龄  城市
    0  张三  25  北京
    1  李四  30  上海
    2  王五  28  广州

    是不是很简单?就像填空题一样,把数据填到对应的列名下面就可以了。

  2. 列表嵌套:从列表创建DataFrame

    如果你喜欢用列表来组织数据,也可以用列表嵌套的方式来创建DataFrame。不过,你需要先定义列名。

    import pandas as pd
    
    data = [['张三', 25, '北京'],
            ['李四', 30, '上海'],
            ['王五', 28, '广州']]
    
    columns = ['姓名', '年龄', '城市']
    
    df = pd.DataFrame(data, columns=columns)
    print(df)

    输出结果和上面一样。这种方式稍微麻烦一点,需要手动指定列名。

  3. NumPy数组:从NumPy数组创建DataFrame

    NumPy是Python中用于科学计算的核心库,它提供了强大的数组操作功能。我们可以用NumPy数组来创建DataFrame,这在处理大量数值数据时非常方便。

    import pandas as pd
    import numpy as np
    
    data = np.array([[1, 2, 3],
                     [4, 5, 6],
                     [7, 8, 9]])
    
    df = pd.DataFrame(data, columns=['A', 'B', 'C'])
    print(df)

    输出结果:

       A  B  C
    0  1  2  3
    1  4  5  6
    2  7  8  9

    这种方式可以快速地将NumPy数组转换为DataFrame,方便进行后续的数据分析。

  4. 文件读取:从文件创建DataFrame

    实际应用中,我们的数据通常存储在文件中,比如CSV文件、Excel文件、JSON文件等等。Pandas提供了强大的文件读取功能,可以轻松地从这些文件中创建DataFrame。

    • CSV文件:

      import pandas as pd
      
      df = pd.read_csv('data.csv')  # 假设data.csv文件存在
      print(df)
    • Excel文件:

      import pandas as pd
      
      df = pd.read_excel('data.xlsx')  # 假设data.xlsx文件存在
      print(df)
    • JSON文件:

      import pandas as pd
      
      df = pd.read_json('data.json')  # 假设data.json文件存在
      print(df)

    这些函数都支持各种参数,可以灵活地控制数据的读取方式。比如,可以指定分隔符、编码方式、跳过行数等等。

  5. 其他方式:

    除了以上几种常见方式,还可以从其他数据源创建DataFrame,比如数据库、网页等等。Pandas提供了相应的接口,可以方便地连接这些数据源。

三、DataFrame的“十八般武艺”:常用操作详解

有了DataFrame,接下来就是如何使用它了。DataFrame提供了丰富的操作方法,可以进行各种数据处理操作。下面,我就给大家介绍一些常用的操作:

  1. 查看数据:

    • head() 查看DataFrame的前几行数据(默认是5行)。

      print(df.head())
    • tail() 查看DataFrame的后几行数据(默认是5行)。

      print(df.tail())
    • sample() 随机查看DataFrame的几行数据(默认是1行)。

      print(df.sample(3))  # 随机查看3行数据
    • info() 查看DataFrame的整体信息,包括列名、数据类型、非空值数量等等。

      print(df.info())
    • describe() 查看DataFrame的统计信息,包括均值、标准差、最小值、最大值等等。

      print(df.describe())
  2. 选择数据:

    • 按列选择:

      # 选择单列
      name_column = df['姓名']  # 或者 df.姓名
      print(name_column)
      
      # 选择多列
      subset = df[['姓名', '年龄']]
      print(subset)
    • 按行选择:

      • loc 按标签选择行。

        # 选择索引为0的行
        first_row = df.loc[0]
        print(first_row)
        
        # 选择索引为0和1的行
        subset = df.loc[[0, 1]]
        print(subset)
      • iloc 按位置选择行。

        # 选择第一行
        first_row = df.iloc[0]
        print(first_row)
        
        # 选择第一行和第二行
        subset = df.iloc[[0, 1]]
        print(subset)
    • 按条件选择:

      # 选择年龄大于28岁的人
      adults = df[df['年龄'] > 28]
      print(adults)
      
      # 选择居住在北京的人
      beijing_residents = df[df['城市'] == '北京']
      print(beijing_residents)
      
      # 选择年龄大于28岁且居住在北京的人
      qualified_people = df[(df['年龄'] > 28) & (df['城市'] == '北京')]
      print(qualified_people)
  3. 修改数据:

    • 修改列名:

      # 修改单个列名
      df = df.rename(columns={'姓名': 'Name'})
      
      # 修改多个列名
      df = df.rename(columns={'年龄': 'Age', '城市': 'City'})
      print(df)
    • 修改列数据:

      # 修改年龄列的数据,所有年龄都加1
      df['Age'] = df['Age'] + 1
      print(df)
      
      # 创建新列,根据年龄判断是否成年
      df['IsAdult'] = df['Age'] >= 18
      print(df)
    • 修改行数据:

      # 修改第一行的年龄
      df.loc[0, 'Age'] = 26
      print(df)
  4. 排序数据:

    # 按年龄升序排序
    df = df.sort_values(by='Age')
    print(df)
    
    # 按年龄降序排序
    df = df.sort_values(by='Age', ascending=False)
    print(df)
    
    # 先按城市排序,再按年龄排序
    df = df.sort_values(by=['City', 'Age'])
    print(df)
  5. 分组聚合:

    分组聚合是数据分析中非常重要的操作,它可以将数据按照某些条件分组,然后对每个组进行聚合计算(比如求和、求平均值、计数等等)。

    # 按城市分组,计算每个城市的平均年龄
    grouped = df.groupby('City')['Age'].mean()
    print(grouped)
    
    # 按城市分组,计算每个城市的人数
    grouped = df.groupby('City')['Name'].count()
    print(grouped)
    
    # 同时进行多个聚合计算
    grouped = df.groupby('City')['Age'].agg(['mean', 'sum', 'count'])
    print(grouped)
  6. 缺失值处理:

    实际数据中,经常会存在缺失值(通常用NaN表示)。Pandas提供了多种方法来处理缺失值。

    • isnull() 判断每个元素是否为缺失值。

      print(df.isnull())
    • notnull() 判断每个元素是否不为缺失值。

      print(df.notnull())
    • dropna() 删除包含缺失值的行或列。

      # 删除包含缺失值的行
      df = df.dropna()
      
      # 删除包含缺失值的列
      df = df.dropna(axis=1)
    • fillna() 用指定的值填充缺失值。

      # 用0填充缺失值
      df = df.fillna(0)
      
      # 用平均值填充缺失值
      df['Age'] = df['Age'].fillna(df['Age'].mean())
  7. 数据合并:

    Pandas提供了多种方法来合并DataFrame,比如concat()merge()等等。

    • concat() 将多个DataFrame沿着指定的轴(行或列)进行拼接。

      df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
      df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
      
      # 沿着行方向拼接
      df = pd.concat([df1, df2])
      print(df)
      
      # 沿着列方向拼接
      df = pd.concat([df1, df2], axis=1)
      print(df)
    • merge() 根据指定的列将两个DataFrame进行连接,类似于SQL中的JOIN操作。

      df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['张三', '李四', '王五']})
      df2 = pd.DataFrame({'ID': [1, 2, 4], 'Age': [25, 30, 28]})
      
      # 根据ID列进行内连接
      df = pd.merge(df1, df2, on='ID')
      print(df)
      
      # 根据ID列进行左连接
      df = pd.merge(df1, df2, on='ID', how='left')
      print(df)
      
      # 根据ID列进行右连接
      df = pd.merge(df1, df2, on='ID', how='right')
      print(df)
      
      # 根据ID列进行外连接
      df = pd.merge(df1, df2, on='ID', how='outer')
      print(df)

四、 DataFrame的“进阶之路”:高级应用探索

掌握了DataFrame的基本操作,你就可以处理大部分的数据分析任务了。但是,如果你想更上一层楼,就需要探索DataFrame的高级应用。

  1. 自定义函数:apply()方法

    apply()方法可以将自定义函数应用到DataFrame的行或列上,实现更灵活的数据处理。

    # 定义一个函数,将年龄乘以2
    def double_age(age):
        return age * 2
    
    # 将double_age函数应用到Age列上
    df['DoubleAge'] = df['Age'].apply(double_age)
    print(df)
  2. 数据透视表:pivot_table()函数

    数据透视表是一种强大的数据汇总工具,它可以将数据按照多个维度进行分组,然后对每个组进行聚合计算,并将结果以表格的形式展示出来。

    import pandas as pd
    
    data = {'City': ['北京', '北京', '上海', '上海', '广州', '广州'],
            'Gender': ['男', '女', '男', '女', '男', '女'],
            'Age': [25, 30, 28, 32, 26, 29]}
    
    df = pd.DataFrame(data)
    
    # 创建数据透视表,以城市为行,性别为列,计算平均年龄
    pivot_table = pd.pivot_table(df, values='Age', index='City', columns='Gender', aggfunc='mean')
    print(pivot_table)
  3. 时间序列分析:

    如果DataFrame中包含时间序列数据,Pandas提供了强大的时间序列分析功能。比如,可以进行日期格式转换、时间序列索引、重采样、移动平均等等。

    import pandas as pd
    
    # 创建一个包含时间序列的DataFrame
    dates = pd.date_range('20230101', periods=10)
    df = pd.DataFrame({'Date': dates, 'Value': range(10)})
    df = df.set_index('Date')
    
    # 重采样,按月计算平均值
    monthly_mean = df.resample('M').mean()
    print(monthly_mean)
  4. 与机器学习库集成:

    DataFrame可以与Scikit-learn、TensorFlow等机器学习库无缝集成,方便进行数据预处理、特征工程和模型训练。

五、 总结:DataFrame,数据分析的“得力助手”

好了,各位观众老爷,今天的“Pandas DataFrame深度游”节目就到这里了。希望通过今天的讲解,大家对DataFrame有了更深入的了解。

总而言之,DataFrame是Pandas库中最核心的数据结构,它是数据分析的“得力助手”,可以帮助我们轻松地处理各种表格数据。只要掌握了DataFrame的常用操作,你就可以在数据分析的道路上越走越远!

记住,编程的乐趣在于实践!多多练习,多多尝试,你一定能成为数据分析的高手!💪

最后,祝大家编程愉快,生活幸福!我们下期再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注