以下是 Pandas DataFrame 常用函数的详细实例与用法大全,每个函数都配有:

  • ✅ 说明
  • ✅ 完整代码示例
  • ✅ 输出结果
  • ✅ 使用场景

适合初学者系统学习或开发者日常查阅。


📦 准备数据(统一示例数据)

import pandas as pd
import numpy as np

# 创建示例 DataFrame
data = {
    'id': [1, 2, 3, 4, 5],
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'age': [25, 30, np.nan, 35, 28],
    'salary': [8000, 9000, 7000, 10000, 8500],
    'city': ['Beijing', 'Shanghai', 'Beijing', 'Shenzhen', 'Beijing'],
    'join_date': ['2022-01-15', '2021-06-10', '2023-03-01', '2020-11-20', '2022-08-05']
}

df = pd.DataFrame(data)
df['join_date'] = pd.to_datetime(df['join_date'])  # 转为日期类型
print("原始数据:")
print(df)

输出:

   id     name   age  salary      city  join_date
0   1    Alice  25.0    8000   Beijing 2022-01-15
1   2      Bob  30.0    9000  Shanghai 2021-06-10
2   3  Charlie   NaN    7000   Beijing 2023-03-01
3   4    David  35.0   10000  Shenzhen 2020-11-20
4   5      Eva  28.0    8500   Beijing 2022-08-05

1️⃣ head()tail() —— 查看前/后几行

🔹 用法:快速浏览数据

print("前3行:")
print(df.head(3))

print("\n后2行:")
print(df.tail(2))

输出:

前3行:
   id     name   age  salary     city join_date
0   1    Alice  25.0    8000  Beijing 2022-01-15
1   2      Bob  30.0    9000 Shanghai 2021-06-10
2   3  Charlie   NaN    7000  Beijing 2023-03-01

后2行:
   id   name   age  salary     city join_date
3   4  David  35.0   10000 Shenzhen 2020-11-20
4   5    Eva  28.0    8500  Beijing 2022-08-05

💡 场景:加载大文件时先看几行确认格式是否正确。


2️⃣ info()describe() —— 数据概览

🔹 info():查看结构信息

df.info()

输出:

<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   name       5 non-null      object        
 2   age        4 non-null      float64       
 3   salary     5 non-null      int64         
 4   city       5 non-null      object        
 5   join_date  5 non-null      datetime64[ns]
dtypes: float64(1), int64(2), object(2), datetime64[ns](1)
memory usage: 248.0+ bytes

✅ 显示每列非空数量、类型、内存使用情况。


🔹 describe():数值列统计摘要

print(df.describe())

输出:

              id         age      salary
count   5.000000    4.000000    5.000000
mean    3.000000   29.500000 8700.000000
std     1.581139    4.203173 1080.138874
min     1.000000   25.000000 7000.000000
25%     2.000000   26.500000 8000.000000
50%     3.000000   29.000000 8500.000000
75%     4.000000   32.500000 9000.000000
max     5.000000   35.000000 10000.000000

💡 可快速发现异常值(如最大值过大)。


3️⃣ isnull()notnull() —— 缺失值检查

print("缺失值数量:")
print(df.isnull().sum())

print("\n哪些位置是空值?")
print(df.isnull())

输出:

缺失值数量:
id           0
name         0
age          1
salary       0
city         0
join_date    0
dtype: int64

哪些位置是空值?
     id   name    age  salary   city  join_date
0  False  False  False   False  False      False
1  False  False  False   False  False      False
2  False  False   True   False  False      False
3  False  False  False   False  False      False
4  False  False  False   False  False      False

4️⃣ dropna() —— 删除缺失值

df_cleaned = df.dropna()  # 删除任何含空值的行
print("删除缺失值后:")
print(df_cleaned)

输出:

   id     name   age  salary      city join_date
0   1    Alice  25.0    8000   Beijing 2022-01-15
1   2      Bob  30.0    9000  Shanghai 2021-06-10
3   4    David  35.0   10000  Shenzhen 2020-11-20
4   5      Eva  28.0    8500   Beijing 2022-08-05

⚠️ 第 2 行(Charlie)被删除了。


5️⃣ fillna() —— 填充缺失值

df_filled = df.fillna({'age': df['age'].mean()})  # 用均值填充 age
print("填充后:")
print(df_filled)

输出:

   id     name   age  salary      city join_date
0   1    Alice 25.00    8000   Beijing 2022-01-15
1   2      Bob 30.00    9000  Shanghai 2021-06-10
2   3  Charlie 29.50    7000   Beijing 2023-03-01
3   4    David 35.00   10000  Shenzhen 2020-11-20
4   5      Eva 28.00    8500   Beijing 2022-08-05

✅ 也可以填 0'Unknown' 或前向填充 method='ffill'


6️⃣ drop_duplicates() —— 去重

假设我们添加重复行:

df_dup = df.append(df.iloc[0], ignore_index=True)  # 复制第一行
print("去重前行数:", len(df_dup))
df_unique = df_dup.drop_duplicates()
print("去重后行数:", len(df_unique))

输出:

去重前行数: 6
去重后行数: 5

✅ 支持 subset=['name'] 按某列去重。


7️⃣ query() —— 条件筛选(推荐可读性好)

high_salary = df.query("salary > 8500")
beijing_staff = df.query("city == 'Beijing'")
young_and_high = df.query("age < 30 and salary > 8000")

print("高薪员工:")
print(high_salary)

输出:

   id     name   age  salary     city join_date
1   2      Bob  30.0    9000 Shanghai 2021-06-10
3   4    David  35.0   10000 Shenzhen 2020-11-20
4   5      Eva  28.0    8500  Beijing 2022-08-05

💡 比 df[df['salary']>8500] 更易读,支持字符串表达式。


8️⃣ lociloc —— 精准索引

🔹 loc:按标签(行列名)

# 提取第0~2行,'name'到'salary'列
print(df.loc[0:2, 'name':'salary'])

输出:

      name   age  salary
0    Alice  25.0    8000
1      Bob  30.0    9000
2  Charlie   NaN    7000

🔹 iloc:按位置(整数索引)

print(df.iloc[1:4, 1:3])  # 第1~3行,第1~2列

输出:

      name   age
1      Bob  30.0
2  Charlie   NaN
3    David  35.0

9️⃣ groupby() + agg() —— 分组聚合

grouped = df.groupby('city').agg({
    'age': 'mean',
    'salary': ['sum', 'count'],
    'id': 'size'
}).round(2)

print("按城市分组统计:")
print(grouped)

输出:

             age      salary         id
            mean         sum count   size
city                                   
Beijing   27.33       23500     3      3
Shanghai  30.00        9000     1      1
Shenzhen  35.00       10000     1      1

size() 统计所有行(含 NaN),count() 只统计非空。


🔟 merge() —— 数据合并(类似 SQL JOIN)

# 另一个表:部门信息
dept = pd.DataFrame({
    'id': [1, 2, 3],
    'department': ['HR', 'Tech', 'Finance']
})

merged = pd.merge(df, dept, on='id', how='left')
print("合并后:")
print(merged)

输出:

   id     name   age  salary      city join_date department
0   1    Alice  25.0    8000   Beijing 2022-01-15         HR
1   2      Bob  30.0    9000  Shanghai 2021-06-10       Tech
2   3  Charlie   NaN    7000   Beijing 2023-03-01    Finance
3   4    David  35.0   10000  Shenzhen 2020-11-20        NaN
4   5      Eva  28.0    8500   Beijing 2022-08-05        NaN

how='left':保留左表所有行。


🔁 apply() —— 自定义函数应用

# 添加一列表示薪资等级
def salary_level(sal):
    if sal >= 10000:
        return 'High'
    elif sal >= 8000:
        return 'Medium'
    else:
        return 'Low'

df['level'] = df['salary'].apply(salary_level)
print(df[['name', 'salary', 'level']])

输出:

      name  salary     level
0    Alice    8000  Medium
1      Bob    9000  Medium
2  Charlie    7000       Low
3    David   10000      High
4      Eva    8500  Medium

🗂️ sort_values() —— 排序

sorted_df = df.sort_values(by='salary', ascending=False)
print("按薪资降序排列:")
print(sorted_df)

输出:

   id     name   age  salary      city join_date     level
3   4    David  35.0   10000  Shenzhen 2020-11-20      High
1   2      Bob  30.0    9000  Shanghai 2021-06-10  Medium
4   5      Eva  28.0    8500   Beijing 2022-08-05  Medium
0   1    Alice  25.0    8000   Beijing 2022-01-15  Medium
2   3  Charlie   NaN    7000   Beijing 2023-03-01       Low

💾 to_csv() / to_excel() —— 保存数据

df.to_csv('output.csv', index=False)
df.to_excel('output.xlsx', sheet_name='员工数据', index=False)
print("✅ 数据已保存")

index=False 避免保存多余的索引列。


🌟 实用技巧合集

技巧 示例
查唯一值 df['city'].unique()['Beijing' 'Shanghai' 'Shenzhen']
值频次统计 df['city'].value_counts()
字符串处理 df['name'].str.upper()
时间提取年份 df['join_date'].dt.year
重命名列 df.rename(columns={'name': '姓名'})
数据类型转换 df['age'] = df['age'].astype('int')
print("各城市人数:")
print(df['city'].value_counts())

print("入职年份:")
print(df['join_date'].dt.year.tolist())

输出:

各城市人数:
Beijing     3
Shenzhen    1
Shanghai    1
Name: city, dtype: int64

入职年份:
[2022, 2021, 2023, 2020, 2022]

✅ 总结:高频函数清单

函数 用途
head() / tail() 快速预览
info() / describe() 数据诊断
isnull().sum() 检查缺失
fillna() / dropna() 处理空值
query() 条件筛选
groupby().agg() 分组统计
merge() 表连接
sort_values() 排序
to_csv() 保存结果

🎯 建议:将此文档保存为 .ipynb.py 文件,在实际项目中反复练习。

更多推荐