Python自动化实战:Pandas 新手快速入门指南

66 阅读21分钟

我将通过一个完整连贯的实例,带你从零开始掌握 Pandas 的核心操作。每个示例都包含完整代码和对应输出,确保你能直观看到每一步的结果。

1.1 DataFrame:你的数据主战场

import pandas as pd
print("=== 1.1 创建DataFrame的多种方式 ===")

# 方式1:从字典创建(最常用)
data = {
    '员工ID': [101, 102, 103, 104, 105],
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, 35, 28, 32],
    '部门': ['技术部', '市场部', '技术部', '人事部', '市场部'],
    '月薪': [8500, 9200, 11000, 7800, 9500],
    '入职年份': [2020, 2019, 2018, 2021, 2019]
}

df = pd.DataFrame(data)
print("从字典创建的DataFrame:")
print(df)

完整输出:

=== 1.1 创建DataFrame的多种方式 ===
从字典创建的DataFrame:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018
3   104  赵六  28  人事部   7800  2021
4   105  钱七  32  市场部   9500  2019

1.2 Series:单列数据对象

print("=== 1.2 Series对象示例 ===")

# 提取单列(得到一个Series)
age_series = df['年龄']
print("年龄列(Series对象):")
print(age_series)
print()

# 查看Series的类型和统计信息
print(f"类型: {type(age_series)}")
print(f"描述统计:")
print(age_series.describe())
print(f"平均值: {age_series.mean()}")
print(f"中位数: {age_series.median()}")

完整输出:

text

=== 1.2 Series对象示例 ===
年龄列(Series对象):
0    25
1    30
2    35
3    28
4    32
Name: 年龄, dtype: int64

类型: <class 'pandas.core.series.Series'>
描述统计:
count     5.000000
mean     30.000000
std       3.807887
min      25.000000
25%      28.000000
50%      30.000000
75%      32.000000
max      35.000000
Name: 年龄, dtype: float64
平均值: 30.0
中位数: 30.0

 第二章:数据查看与探索

2.1 基本信息查看

print("=== 2.1 数据基本信息 ===")

print("1. 查看前3行:")
print(df.head(3))
print()

print("2. 查看后2行:")
print(df.tail(2))
print()

print("3. 查看数据形状(行数, 列数):")
print(f"df.shape = {df.shape}")
print(f"总行数: {df.shape[0]}, 总列数: {df.shape[1]}")
print()

print("4. 查看列名:")
print(f"df.columns = {df.columns.tolist()}")
print()

print("5. 查看数据类型:")
print(df.dtypes)
print()

print("6. 查看详细信息:")
df.info()
print()

print("7. 数值列的描述性统计:")
print(df.describe())

完整输出:

=== 2.1 数据基本信息 ===
1. 查看前3行:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018

2. 查看后2行:
   员工ID  姓名  年龄   部门    月薪  入职年份
3   104  赵六  28  人事部   7800  2021
4   105  钱七  32  市场部   9500  2019

3. 查看数据形状(行数, 列数):
df.shape = (5, 6)
总行数: 5, 总列数: 6

4. 查看列名:
df.columns = ['员工ID', '姓名', '年龄', '部门', '月薪', '入职年份']

5. 查看数据类型:
员工ID      int64
姓名       object
年龄       int64
部门       object
月薪       int64
入职年份     int64
dtype: object

6. 查看详细信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   员工ID    5 non-null      int64 
 1   姓名      5 non-null      object
 2   年龄      5 non-null      int64 
 3   部门      5 non-null      object
 4   月薪      5 non-null      int64 
 5   入职年份    5 non-null      int64 
dtypes: int64(4), object(2)
memory usage: 368.0+ bytes

7. 数值列的描述性统计:
           员工ID         年龄          月薪       入职年份
count    5.000000    5.000000     5.000000    5.000000
mean   103.000000   30.000000  9200.000000 2019.400000
std      1.581140    3.807887  1252.998405    1.140175
min    101.000000   25.000000  7800.000000 2018.000000
25%    102.000000   28.000000  8500.000000 2019.000000
50%    103.000000   30.000000  9200.000000 2019.000000
75%    104.000000   32.000000  9500.000000 2020.000000
max    105.000000   35.000000 11000.000000 2021.000000

2.2 唯一值与计数

print("=== 2.2 唯一值与计数 ===")

print("1. 部门唯一值:")
print(f"df['部门'].unique() = {df['部门'].unique()}")
print()

print("2. 各部门员工数量:")
print(df['部门'].value_counts())
print()

print("3. 各部门员工数量(百分比):")
print(df['部门'].value_counts(normalize=True))

完整输出:

=== 2.2 唯一值与计数 ===
1. 部门唯一值:
df['部门'].unique() = ['技术部' '市场部' '人事部']

2. 各部门员工数量:
部门
市场部    2
技术部    2
人事部    1
Name: count, dtype: int64

3. 各部门员工数量(百分比):
部门
市场部    0.4
技术部    0.4
人事部    0.2
Name: proportion, dtype: float64

 第三章:数据选择与筛选

3.1 选择列数据

print("=== 3.1 选择列数据 ===")

print("1. 选择单列(返回Series):")
names = df['姓名']
print(names)
print()

print("2. 选择多列(返回DataFrame):")
subset = df[['姓名', '部门', '月薪']]
print(subset)
print()

print("3. 使用点表示法(列名无空格时可用):")
ages = df.年龄
print(ages)

完整输出:

=== 3.1 选择列数据 ===
1. 选择单列(返回Series):
0    张三
1    李四
2    王五
3    赵六
4    钱七
Name: 姓名, dtype: object

2. 选择多列(返回DataFrame):
   姓名   部门    月薪
0  张三  技术部   8500
1  李四  市场部   9200
2  王五  技术部  11000
3  赵六  人事部   7800
4  钱七  市场部   9500

3. 使用点表示法(列名无空格时可用):
0    25
1    30
2    35
3    28
4    32
Name: 年龄, dtype: int64

3.2 选择行数据

print("=== 3.2 选择行数据 ===")

print("1. 按位置选择(iloc):")
print("第2行(索引为2):")
print(df.iloc[2])
print()

print("第1-3行(不含第3行):")
print(df.iloc[1:3])
print()

print("2. 按标签选择(loc):")
print("选择索引为0和3的行:")
print(df.loc[[0, 3]])
print()

print("3. 选择特定行列组合:")
print("选择第0、2行和姓名、月薪列:")
print(df.loc[[0, 2], ['姓名', '月薪']])

完整输出:

=== 3.2 选择行数据 ===
1. 按位置选择(iloc):
第2行(索引为2):
员工ID        103
姓名         王五
年龄          35
部门        技术部
月薪       11000
入职年份      2018
Name: 2, dtype: object

第1-3行(不含第3行):
   员工ID  姓名  年龄   部门    月薪  入职年份
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018

2. 按标签选择(loc):
选择索引为0和3的行:
   员工ID  姓名  年龄   部门   月薪  入职年份
0   101  张三  25  技术部  8500  2020
3   104  赵六  28  人事部  7800  2021

3. 选择特定行列组合:
选择第0、2行和姓名、月薪列:
   姓名    月薪
0  张三   8500
2  王五  11000

3.3 条件筛选(最重要的功能!)

print("=== 3.3 条件筛选 ===")

print("1. 简单条件:月薪大于9000的员工:")
high_salary = df[df['月薪'] > 9000]
print(high_salary)
print()

print("2. 多条件筛选(注意括号):")
print("市场部且月薪大于9000的员工:")
marketing_high = df[(df['部门'] == '市场部') & (df['月薪'] > 9000)]
print(marketing_high)
print()

print("3. 年龄在25-30岁之间的员工:")
young = df[df['年龄'].between(25, 30)]
print(young)
print()

print("4. 部门在特定列表中:")
dept_filter = df[df['部门'].isin(['技术部', '人事部'])]
print(dept_filter)
print()

print("5. 字符串包含筛选:")
print("姓名中包含'三'的员工:")
name_filter = df[df['姓名'].str.contains('三')]
print(name_filter)
print()

print("6. 复杂条件组合:")
complex_filter = df[
    (df['月薪'] > 8000) & 
    (df['年龄'] < 35) & 
    (df['部门'].isin(['技术部', '市场部']))
]
print("月薪>8000, 年龄<35, 且是技术部或市场部:")
print(complex_filter)

完整输出:

=== 3.3 条件筛选 ===
1. 简单条件:月薪大于9000的员工:
   员工ID  姓名  年龄   部门    月薪  入职年份
2   103  王五  35  技术部  11000  2018
4   105  钱七  32  市场部   9500  2019

2. 多条件筛选(注意括号):
市场部且月薪大于9000的员工:
   员工ID  姓名  年龄   部门   月薪  入职年份
4   105  钱七  32  市场部  9500  2019

3. 年龄在25-30岁之间的员工:
   员工ID  姓名  年龄   部门   月薪  入职年份
0   101  张三  25  技术部  8500  2020
1   102  李四  30  市场部  9200  2019
3   104  赵六  28  人事部  7800  2021

4. 部门在特定列表中:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
2   103  王五  35  技术部  11000  2018
3   104  赵六  28  人事部   7800  2021

5. 字符串包含筛选:
姓名中包含'三'的员工:
   员工ID  姓名  年龄   部门   月薪  入职年份
0   101  张三  25  技术部  8500  2020

6. 复杂条件组合:
月薪>8000, 年龄<35, 且是技术部或市场部:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018
4   105  钱七  32  市场部   9500  2019

第四章:数据清洗与处理

4.1 处理缺失值(创建含缺失值的数据)

print("=== 4.1 处理缺失值 ===")

# 创建含有缺失值的数据
data_with_nan = {
    '员工ID': [101, 102, 103, 104, 105],
    '姓名': ['张三', '李四', None, '赵六', '钱七'],
    '年龄': [25, 30, None, 28, 32],
    '部门': ['技术部', '市场部', '技术部', None, '市场部'],
    '月薪': [8500, 9200, 11000, 7800, None],
    '入职年份': [2020, 2019, 2018, 2021, 2019]
}

df_nan = pd.DataFrame(data_with_nan)
print("原始数据(包含缺失值):")
print(df_nan)
print()

print("1. 检查缺失值:")
print(df_nan.isnull())
print()

print("2. 每列缺失值数量:")
print(df_nan.isnull().sum())
print()

print("3. 删除包含缺失值的行(默认删除任何包含NaN的行):")
df_dropped = df_nan.dropna()
print(df_dropped)
print()

print("4. 删除所有值都为NaN的行:")
df_dropped_all = df_nan.dropna(how='all')
print(df_dropped_all)
print()

print("5. 填充缺失值:")
print("用固定值填充:")
df_filled_const = df_nan.fillna('未知')
print(df_filled_const)
print()

print("用每列的平均值填充:")
df_filled_mean = df_nan.copy()
df_filled_mean['年龄'] = df_filled_mean['年龄'].fillna(df_filled_mean['年龄'].mean())
df_filled_mean['月薪'] = df_filled_mean['月薪'].fillna(df_filled_mean['月薪'].mean())
print(df_filled_mean)
print()

print("向前填充(用上一行的值填充):")
df_ffill = df_nan.fillna(method='ffill')
print(df_ffill)

完整输出(部分关键输出):

=== 4.1 处理缺失值 ===
原始数据(包含缺失值):
   员工ID   姓名    年龄   部门      月薪  入职年份
0   101   张三  25.0  技术部   8500.0  2020
1   102   李四  30.0  市场部   9200.0  2019
2   103  None   NaN  技术部  11000.0  2018
3   104   赵六  28.0  None   7800.0  2021
4   105   钱七  32.0  市场部      NaN  2019

每列缺失值数量:
员工ID    0
姓名      1
年龄      1
部门      1
月薪      1
入职年份    0
dtype: int64

删除包含缺失值的行(默认删除任何包含NaN的行):
   员工ID  姓名    年龄   部门     月薪  入职年份
0   101  张三  25.0  技术部  8500.0  2020
1   102  李四  30.0  市场部  9200.0  2019

用每列的平均值填充:
   员工ID   姓名    年龄   部门      月薪  入职年份
0   101   张三  25.0  技术部   8500.0  2020
1   102   李四  30.0  市场部   9200.0  2019
2   103  None  28.75  技术部  11000.0  2018
3   104   赵六  28.0  未知   7800.0  2021
4   105   钱七  32.0  市场部   9125.0  2019

4.2 处理重复值

print("=== 4.2 处理重复值 ===")

# 创建含有重复值的数据
data_dup = {
    '员工ID': [101, 102, 103, 101, 104, 102],
    '姓名': ['张三', '李四', '王五', '张三', '赵六', '李四'],
    '部门': ['技术部', '市场部', '技术部', '技术部', '人事部', '市场部'],
    '月薪': [8500, 9200, 11000, 8500, 7800, 9200]
}

df_dup = pd.DataFrame(data_dup)
print("原始数据(包含重复值):")
print(df_dup)
print()

print("1. 检查重复行(完全相同的行):")
print(f"重复行数量: {df_dup.duplicated().sum()}")
print()

print("2. 查看重复行:")
duplicates = df_dup[df_dup.duplicated()]
print(duplicates)
print()

print("3. 删除所有重复行:")
df_no_dup = df_dup.drop_duplicates()
print(df_no_dup)
print()

print("4. 基于特定列检查重复(如员工ID):")
print(f"重复的员工ID数量: {df_dup['员工ID'].duplicated().sum()}")
print()

print("5. 删除基于员工ID的重复行(保留第一个):")
df_unique_id = df_dup.drop_duplicates(subset=['员工ID'])
print(df_unique_id)

完整输出:

=== 4.2 处理重复值 ===
原始数据(包含重复值):
   员工ID  姓名   部门    月薪
0   101  张三  技术部   8500
1   102  李四  市场部   9200
2   103  王五  技术部  11000
3   101  张三  技术部   8500
4   104  赵六  人事部   7800
5   102  李四  市场部   9200

1. 检查重复行(完全相同的行):
重复行数量: 2

2. 查看重复行:
   员工ID  姓名   部门    月薪
3   101  张三  技术部   8500
5   102  李四  市场部   9200

3. 删除所有重复行:
   员工ID  姓名   部门    月薪
0   101  张三  技术部   8500
1   102  李四  市场部   9200
2   103  王五  技术部  11000
4   104  赵六  人事部   7800

5. 删除基于员工ID的重复行(保留第一个):
   员工ID  姓名   部门    月薪
0   101  张三  技术部   8500
1   102  李四  市场部   9200
2   103  王五  技术部  11000
4   104  赵六  人事部   7800

4.3 数据类型转换

print("=== 4.3 数据类型转换 ===")

# 创建混合类型数据
data_types = {
    '字符串数字': ['100', '200', '300'],
    '布尔字符串': ['True', 'False', 'True'],
    '日期字符串': ['2023-01-01', '2023-02-01', '2023-03-01'],
    '带逗号的数字': ['1,000', '2,500', '3,750.50']
}

df_types = pd.DataFrame(data_types)
print("原始数据:")
print(df_types)
print(f"原始数据类型:\n{df_types.dtypes}")
print()

print("1. 字符串转整数:")
df_types['字符串数字'] = df_types['字符串数字'].astype('int')
print(df_types['字符串数字'])
print()

print("2. 字符串转浮点数:")
df_types['字符串数字_float'] = df_types['字符串数字'].astype('float')
print(df_types[['字符串数字', '字符串数字_float']])
print()

print("3. 字符串转布尔:")
df_types['布尔值'] = df_types['布尔字符串'].map({'True': True, 'False': False})
print(df_types[['布尔字符串', '布尔值']])
print()

print("4. 字符串转日期:")
df_types['日期'] = pd.to_datetime(df_types['日期字符串'])
print(df_types[['日期字符串', '日期']])
print()

print("5. 处理带逗号的数字字符串:")
df_types['清洗后数字'] = df_types['带逗号的数字'].str.replace(',', '').astype('float')
print(df_types[['带逗号的数字', '清洗后数字']])
print()

print("最终数据类型:")
print(df_types.dtypes)

完整输出(部分):

=== 4.3 数据类型转换 ===
原始数据:
  字符串数字 布尔字符串    日期字符串   带逗号的数字
0    100    True  2023-01-01     1,000
1    200   False  2023-02-01     2,500
2    300    True  2023-03-01  3,750.50
原始数据类型:
字符串数字      object
布尔字符串      object
日期字符串      object
带逗号的数字    object
dtype: object

1. 字符串转整数:
0    100
1    200
2    300
Name: 字符串数字, dtype: int64

最终数据类型:
字符串数字              int64
布尔字符串            object
日期字符串            object
带逗号的数字          object
字符串数字_float     float64
布尔值                 bool
日期         datetime64[ns]
清洗后数字           float64
dtype: object

4.4 使用apply和lambda表达式进行数据转化

假设我们有以下数据:

import pandas as pd

# 示例数据:每个人的上级/父级名称
mapped_df = pd.DataFrame({
    'Name': ['张三', '李四', '王五', '赵六'],
    'Parent.Name': ['经理A', '经理B', '经理A', '总监C']
})

print("原始数据:")
print(mapped_df)

输出:

   Name Parent.Name
0   张三        经理A
1   李四        经理B
2   王五        经理A
3   赵六        总监C

定义映射字典

# 父级名称到ID的映射关系
parent_id_map = {
    '经理A': 'P001',
    '经理B': 'P002',
    '总监C': 'P003',
    # 注意:这里没有 总监D
}

print("\n映射字典:", parent_id_map)

执行映射

# 创建ParentId列
mapped_df['ParentId'] = mapped_df['Parent.Name'].apply(lambda x: parent_id_map.get(x, ''))

print("\n映射后的数据:")
print(mapped_df)

输出:

   Name Parent.Name ParentId
0   张三        经理A     P001
1   李四        经理B     P002
2   王五        经理A     P001
3   赵六        总监C     P003

第五章:数据分析与计算

5.1 基本统计计算

print("=== 5.1 基本统计计算 ===")

# 使用原始df数据
print("原始数据:")
print(df)
print()

print("1. 单列统计:")
print(f"月薪总和: {df['月薪'].sum()}")
print(f"平均年龄: {df['年龄'].mean():.2f}")
print(f"月薪最大值: {df['月薪'].max()}")
print(f"月薪最小值: {df['月薪'].min()}")
print(f"月薪中位数: {df['月薪'].median()}")
print(f"月薪标准差: {df['月薪'].std():.2f}")
print(f"月薪方差: {df['月薪'].var():.2f}")
print()

print("2. 多列统计:")
print("各数值列的总和:")
print(df[['年龄', '月薪', '入职年份']].sum())
print()

print("3. 累计计算:")
df['月薪累计'] = df['月薪'].cumsum()
df['年龄累计平均'] = df['年龄'].expanding().mean()
print(df[['姓名', '月薪', '月薪累计', '年龄', '年龄累计平均']])

完整输出:

=== 5.1 基本统计计算 ===
原始数据:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018
3   104  赵六  28  人事部   7800  2021
4   105  钱七  32  市场部   9500  2019

1. 单列统计:
月薪总和: 46000
平均年龄: 30.00
月薪最大值: 11000
月薪最小值: 7800
月薪中位数: 9200
月薪标准差: 1253.00
月薪方差: 1570000.00

3. 累计计算:
   姓名    月薪  月薪累计  年龄  年龄累计平均
0  张三   8500    8500   25      25.000000
1  李四   9200   17700   30      27.500000
2  王五  11000   28700   35      30.000000
3  赵六   7800   36500   28      29.500000
4  钱七   9500   46000   32      30.000000

5.2 分组聚合(强大功能)

print("=== 5.2 分组聚合操作 ===")

print("原始数据:")
print(df)
print()

print("1. 按部门分组,计算平均月薪:")
dept_avg_salary = df.groupby('部门')['月薪'].mean()
print(dept_avg_salary)
print()

print("2. 按部门分组,多个统计指标:")
dept_stats = df.groupby('部门').agg({
    '月薪': ['mean', 'min', 'max', 'sum', 'count'],
    '年龄': ['mean', 'min', 'max'],
    '员工ID': 'count'
})
print(dept_stats)
print()

print("3. 按部门和入职年份分组:")
dept_year_stats = df.groupby(['部门', '入职年份']).agg({
    '月薪': 'mean',
    '年龄': 'mean',
    '员工ID': 'count'
}).rename(columns={'员工ID': '人数'})
print(dept_year_stats)
print()

print("4. 分组后重置索引(转换为普通DataFrame):")
dept_stats_reset = df.groupby('部门')['月薪'].mean().reset_index()
print(dept_stats_reset)
print()

print("5. 按部门分组,显示每个部门所有员工:")
for dept, group in df.groupby('部门'):
    print(f"\n部门: {dept}")
    print(group[['姓名', '年龄', '月薪']])

完整输出:

=== 5.2 分组聚合操作 ===
原始数据:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018
3   104  赵六  28  人事部   7800  2021
4   105  钱七  32  市场部   9500  2019

1. 按部门分组,计算平均月薪:
部门
人事部     7800.0
市场部     9350.0
技术部     9750.0
Name: 月薪, dtype: float64

2. 按部门分组,多个统计指标:
          月薪                          年龄      员工ID
          mean   min    max   sum count  mean min max count
部门                                                        
人事部   7800.0  7800   7800  7800     1  28.0  28  28     1
市场部   9350.0  9200   9500 18700     2  31.0  30  32     2
技术部   9750.0  8500  11000 19500     2  30.0  25  35     2

3. 按部门和入职年份分组:
                月薪   年龄  人数
部门  入职年份                  
人事部 2021   7800.0  28.0   1
市场部 2019   9350.0  31.0   2
技术部 2018  11000.0  35.0   1
      2020   8500.0  25.0   1

4. 分组后重置索引(转换为普通DataFrame):
    部门      月薪
0  人事部  7800.0
1  市场部  9350.0
2  技术部  9750.0

5.3 排序与排名

print("=== 5.3 排序与排名 ===")

print("原始数据:")
print(df)
print()

print("1. 按单列排序(默认升序):")
sorted_by_age = df.sort_values('年龄')
print(sorted_by_age)
print()

print("2. 按单列降序排序:")
sorted_by_salary_desc = df.sort_values('月薪', ascending=False)
print(sorted_by_salary_desc)
print()

print("3. 按多列排序:")
sorted_multi = df.sort_values(['部门', '月薪'], ascending=[True, False])
print(sorted_multi)
print()

print("4. 添加排名:")
df['月薪排名'] = df['月薪'].rank(ascending=False, method='dense').astype(int)
df['年龄排名'] = df['年龄'].rank(ascending=True, method='min').astype(int)
print(df.sort_values('月薪排名'))
print()

print("5. 按索引排序:")
df_sorted_index = df.sort_index(ascending=False)
print(df_sorted_index)

完整输出:

=== 5.3 排序与排名 ===
原始数据:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018
3   104  赵六  28  人事部   7800  2021
4   105  钱七  32  市场部   9500  2019

1. 按单列排序(默认升序):
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
3   104  赵六  28  人事部   7800  2021
1   102  李四  30  市场部   9200  2019
4   105  钱七  32  市场部   9500  2019
2   103  王五  35  技术部  11000  2018

2. 按单列降序排序:
   员工ID  姓名  年龄   部门    月薪  入职年份
2   103  王五  35  技术部  11000  2018
4   105  钱七  32  市场部   9500  2019
1   102  李四  30  市场部   9200  2019
0   101  张三  25  技术部   8500  2020
3   104  赵六  28  人事部   7800  2021

4. 添加排名:
   员工ID  姓名  年龄   部门    月薪  入职年份  月薪排名  年龄排名
2   103  王五  35  技术部  11000  2018        1       5
4   105  钱七  32  市场部   9500  2019        2       4
1   102  李四  30  市场部   9200  2019        3       3
0   101  张三  25  技术部   8500  2020        4       1
3   104  赵六  28  人事部   7800  2021        5       2

第六章:数据输入输出

6.1 读写文件

print("=== 6.1 读写文件 ===")

# 先保存示例数据到文件
print("1. 保存到CSV文件:")
df.to_csv('employees.csv', index=False, encoding='utf-8-sig')
print("已保存到 employees.csv")
print()

print("2. 从CSV文件读取:")
df_from_csv = pd.read_csv('employees.csv')
print(df_from_csv)
print()

print("3. 保存到Excel文件:")
df.to_excel('employees.xlsx', sheet_name='员工数据', index=False)
print("已保存到 employees.xlsx")
print()

print("4. 从Excel文件读取:")
df_from_excel = pd.read_excel('employees.xlsx', sheet_name='员工数据')
print(df_from_excel)
print()

print("5. 保存到JSON文件:")
df.to_json('employees.json', orient='records', force_ascii=False)
print("已保存到 employees.json")
print()

print("6. 从JSON文件读取:")
df_from_json = pd.read_json('employees.json')
print(df_from_json)

完整输出:

=== 6.1 读写文件 ===
1. 保存到CSV文件:
已保存到 employees.csv

2. 从CSV文件读取:
   员工ID  姓名  年龄   部门    月薪  入职年份
0   101  张三  25  技术部   8500  2020
1   102  李四  30  市场部   9200  2019
2   103  王五  35  技术部  11000  2018
3   104  赵六  28  人事部   7800  2021
4   105  钱七  32  市场部   9500  2019
任务类别常用方法示例
数据查看head()tail()info()describe()df.head(5)
数据选择loc[]iloc[], 条件筛选df.loc[0, '姓名']
数据筛选布尔索引, isin()between()df[df['月薪'] > 9000]
数据清洗dropna()fillna()drop_duplicates()df.dropna()
数据类型astype()to_datetime()df['年龄'].astype('float')
数据排序sort_values()sort_index()df.sort_values('月薪', ascending=False)
分组聚合groupby()agg()df.groupby('部门')['月薪'].mean()
统计计算mean()sum()min()max()df['月薪'].mean()
数据转换apply()map()str方法df['姓名'].str.upper()
文件读写to_csv()read_csv()to_excel()pd.read_csv('data.csv')

总结

  1. 生成csv还是用pandas比较好