Pandas

使用 泰坦尼克号乘客数据集

  1. 理解 Pandas 的两大核心数据结构

    1. Series:一维数据结构,类似于列表或数组

      1
      2
      df = pd.Series([1,2,3,4])
      print(df)

      输出结果:

      1
      2
      3
      4
      5
      0    1
      1 2
      2 3
      3 4
      dtype: int64
    2. DataFrame:二维数据结构,类似于表格或电子表格。

      1
      2
      3
      4
      5
      6
      df = pd.DataFrame({
      "Name":['kangkang','liubei','hangliu'],
      "Age":[12,23,25],
      "Sex":["男","男","女"]
      })
      print(df)

      输出结果:

      1
      2
      3
      4
             Name  Age Sex
      0 kangkang 12 男
      1 liubei 23 男
      2 hangliu 25 女
  2. 加载和查看数据

    1
    2
    3
    4
    df = pd.read_csv('titanic.csv')
    print(df.head(2)) # 查看前几行
    print(df.tail(2)) # 查看最后几行
    print(df.info()) # 查看数据的基本信息(列、非空值等)

    输出内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
       PassengerId  Survived  ...  Cabin Embarked
    0 1 0 ... NaN S
    1 2 1 ... C85 C

    [2 rows x 12 columns]
    PassengerId Survived ... Cabin Embarked
    889 890 1 ... C148 C
    890 891 0 ... NaN Q

    [2 rows x 12 columns]


    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 891 entries, 0 to 890
    Data columns (total 12 columns):
    # Column Non-Null Count Dtype
    --- ------ -------------- -----
    0 PassengerId 891 non-null int64
    1 Survived 891 non-null int64
    2 Pclass 891 non-null int64
    3 Name 891 non-null object
    4 Sex 891 non-null object
    5 Age 714 non-null float64
    6 SibSp 891 non-null int64
    7 Parch 891 non-null int64
    8 Ticket 891 non-null object
    9 Fare 891 non-null float64
    10 Cabin 204 non-null object
    11 Embarked 889 non-null object
    dtypes: float64(2), int64(5), object(5)
    memory usage: 83.7+ KB
    #这里具体解释一下 ,这里列出了数据集是891行,12列,每一列表示数据集中的一个特征(例如乘客ID、是否幸存、乘客等级、名字、性别、年龄等),而每一行代表一个乘客的记录。
  3. 数据选择与筛选

    1
    2
    3
    print(df['name'])  # 选择'name'这一列
    print(df.iloc[0]) # 选择第一行
    print(df[df['age'] > 15]) # 筛选出age大于15的行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    0    kangkang
    1 liula
    2 hahaha
    Name: name, dtype: object

    name kangkang
    age 17
    sex maln
    Name: 0, dtype: object

    name age sex
    0 kangkang 17 maln
    1 liula 18 woman
  4. 数据清洗与处理

    1. 处理缺失值

      1
      2
      3
      df.isnull().sum()  # 查看每列缺失值的数量
      df.dropna() # 删除所有包含缺失值的行
      df.fillna(0) # 用 0 填充缺失值
    2. 重复数据处理

      1
      df.drop_duplicates(inplace=True)  # 删除重复行
  5. 排序

    1
    df.sort_values(by='Age', ascending=False)  # 按照年龄降序排序(ascending=False降序)
  6. 分组操作

    1
    df.groupby('City')['Age'].mean()  # 按照城市分组,计算每个城市的平均年龄
  7. 合并和连接数据

    1. 合并

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
      df2 = pd.DataFrame({'ID': [1, 2, 4], 'Age': [25, 30, 35]})
      merged_df = pd.merge(df1, df2, on='ID', how='inner') # 根据 ID 列进行合并
      # on:指定根据哪些列来进行合并。它可以是单个列名或列名的列表。
      # how:指定合并的方式(类似于 SQL 中的 JOIN 操作)。常见的选项有:
      # 'inner':默认方式,取两个 DataFrame 中都有的匹配行。
      # 'outer':返回两个 DataFrame 的所有行,不匹配的地方会用 NaN 填充。
      # 'left':返回左侧 DataFrame 的所有行,并将右侧 DataFrame 中匹配的行附加上,不匹配的右侧数据为 NaN。
      # 'right':返回右侧 DataFrame 的所有行,并将左侧 DataFrame 中匹配的行附加上,不匹配的左侧数据为 NaN。
      print(merged_df)
    2. 拼接

      1
      2
      3
      4
      5
      df1 = pd.DataFrame({'Name': ['Alice'], 'Age': [25]})
      df2 = pd.DataFrame({'Name': ['Bob'], 'Age': [30]})
      concat_df = pd.concat([df1, df2], ignore_index=True) # 按行拼接
      print(concat_df)

  8. 保存数据

    1
    2
    3
    df.to_csv('output.csv', index=False)  # 保存为 CSV 文件
    df.to_excel('output.xlsx', index=False) # 保存为 Excel 文件