Pandas 数据处理完全指南:DataFrame、清洗、聚合与合并

小飞兽 NumPy/Pandas 8 次阅读 2026-07-29

Pandas 是基于 NumPy 构建的数据分析库,提供了 DataFrame(二维表格)和 Series(一维序列)两种核心数据结构,以及丰富的数据读取、清洗、变换、聚合、可视化功能。

一、DataFrame 基础操作

import pandas as pd
import numpy as np

df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 30, 35, 28, 32],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai'],
'salary': [15000, 22000, 18000, 25000, 20000],
'joined': pd.to_datetime(['2022-01-15', '2021-06-20', '2023-03-10', '2020-11-05', '2022-08-01']),
})
print(df)
print(df.dtypes)
print(df.shape)
print(df.describe())

print(df['name'])
print(df[['name', 'age']])
print(df.iloc[0])
print(df[df['age'] > 30])
print(df[(df['city'] == 'Beijing') & (df['salary'] > 15000)])

二、数据清洗与变换

df2 = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [5, np.nan, np.nan, 8], 'C': [9, 10, 11, 12]})
print(df2.isnull())
print(df2.isnull().sum())
print(df2.fillna(0))
print(df2['A'].fillna(df2['A'].mean()))
print(df2.dropna())

df3 = pd.DataFrame({'name': ['Alice', 'Bob', 'Alice', 'David'], 'score': [95, 88, 95, 91]})
print(df3.duplicated())
print(df3.drop_duplicates())
print(df3.drop_duplicates(subset=['name']))

df['age'] = df['age'].astype('float32')
df['year'] = df['joined'].dt.year
df['month'] = df['joined'].dt.month

print(df.sort_values(by='salary', ascending=False))
print(df.sort_values(by=['city', 'salary'], ascending=[True, False]))

三、分组聚合与合并

print(df.groupby('city')['salary'].mean())
print(df.groupby('city').agg({'salary': ['mean', 'max', 'min'], 'age': 'mean'}))

for city, group in df.groupby('city'):
print(f'=== {city} ===')
print(f'人数: {len(group)}, 平均薪资: {group["salary"].mean():.0f}')

pivot = df.pivot_table(values='salary', index='city', columns='name', aggfunc='sum', fill_value=0)
print(pivot)

df['salary_rank'] = df['salary'].rank(ascending=False)
df['salary_cumsum'] = df['salary'].cumsum()
df['salary_pct_change'] = df['salary'].pct_change()

df_left = pd.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie']})
df_right = pd.DataFrame({'id': [2, 3, 4], 'score': [88, 95, 72]})
merged = pd.merge(df_left, df_right, on='id', how='inner')
merged_left = pd.merge(df_left, df_right, on='id', how='left')
concated = pd.concat([df_left, df_right], axis=0)

四、常见问题

Q1:DataFrame 读取大文件内存不足怎么办?
使用 chunksize 参数分块读取:pd.read_csv('big.csv', chunksize=10000)

Q2:如何高效地对大型 DataFrame 去重?
使用 df.drop_duplicates(),内部使用哈希表实现,时间复杂度接近 O(n)。

Q3:merge 和 join 有什么区别?
pd.merge() 基于列值进行连接(类似 SQL JOIN)。df1.join(df2) 基于索引进行连接。

五、延伸阅读

    • Cookbook(pandas 官方食谱)
    • 可视化:Pandas 内置 df.plot()
  • 性能优化:pandas.DataFrame.to_numpy()