《pandas库介绍之DataFrame基本操作》
pandas作为Python数据分析的核心库,其DataFrame数据结构提供了高效的数据操作能力。本文将系统梳理DataFrame的基础操作,涵盖创建、索引、筛选、聚合、合并等核心功能,帮助读者快速掌握数据分析的关键技术。
一、DataFrame基础概念
DataFrame是pandas中二维标签化数据结构,可类比为Excel表格或SQL表。它由行索引(index)、列索引(columns)和数据值(values)组成,支持异构数据类型(数值、字符串、布尔值等)的混合存储。
import pandas as pd
import numpy as np
# 创建简单DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Paris']}
df = pd.DataFrame(data)
print(df)
输出结果:
Name Age City
0 Alice 25 New York
1 Bob 30 London
2 Charlie 35 Paris
二、DataFrame创建方法
1. 从字典创建
# 指定索引
df = pd.DataFrame(data, index=['a', 'b', 'c'])
# 嵌套字典(外层键为列名)
nested_data = {'Col1': {'a': 1, 'b': 2},
'Col2': {'a': 3, 'b': 4}}
df_nested = pd.DataFrame(nested_data)
2. 从NumPy数组创建
arr = np.array([[1, 2, 3], [4, 5, 6]])
df_arr = pd.DataFrame(arr, columns=['A', 'B', 'C'])
3. 从CSV文件读取
df_csv = pd.read_csv('data.csv')
# 常用参数
df_csv = pd.read_csv('data.csv',
sep=',',
header=0,
index_col='ID',
na_values=['NA', 'NULL'])
三、数据索引与选择
1. 基本索引方法
# 通过列名选择单列(返回Series)
ages = df['Age']
# 选择多列(返回DataFrame)
sub_df = df[['Name', 'City']]
# 使用loc进行标签索引
print(df.loc['a', 'Col1']) # 字典式访问
print(df.loc[:, ['Name', 'Age']]) # 所有行,指定列
# 使用iloc进行位置索引
print(df.iloc[0, 1]) # 第1行第2列(从0开始)
print(df.iloc[:2, :]) # 前两行所有列
2. 布尔索引
# 条件筛选
adults = df[df['Age'] >= 30]
# 多条件组合
result = df[(df['Age'] > 25) & (df['City'].str.contains('o'))]
3. 随机抽样
# 简单随机抽样
sample = df.sample(n=2)
# 分层抽样(按City分组后抽样)
sample_strat = df.groupby('City').apply(lambda x: x.sample(1)).reset_index(drop=True)
四、数据清洗与处理
1. 缺失值处理
# 检测缺失值
print(df.isnull().sum())
# 删除缺失值
df_clean = df.dropna()
# 填充缺失值
df_filled = df.fillna({'Age': df['Age'].mean(), 'City': 'Unknown'})
2. 数据类型转换
# 查看数据类型
print(df.dtypes)
# 转换数据类型
df['Age'] = df['Age'].astype(str)
df['Date'] = pd.to_datetime(df['Date'])
3. 字符串处理
# 字符串方法链式操作
df['City'] = df['City'].str.upper().str.replace(' ', '_')
# 正则表达式提取
df['City_Code'] = df['City'].str.extract(r'([A-Z]+)')
五、数据聚合与统计
1. 基本统计量
# 描述性统计
print(df.describe())
# 单列统计
print(df['Age'].mean(), df['Age'].std())
# 分组聚合
grouped = df.groupby('City')['Age'].agg(['mean', 'max', 'count'])
2. 透视表与交叉表
# 透视表
pivot = pd.pivot_table(df,
values='Age',
index='City',
columns='Gender',
aggfunc='mean')
# 交叉表
cross_tab = pd.crosstab(df['City'], df['Gender'])
3. 自定义聚合函数
# 定义聚合函数
def range_calc(series):
return series.max() - series.min()
# 应用自定义函数
result = df.groupby('City')['Age'].agg(range_calc)
六、数据合并与连接
1. 横向合并(concat)
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 纵向合并(默认axis=0)
df_vert = pd.concat([df1, df2], ignore_index=True)
# 横向合并(axis=1)
df_horiz = pd.concat([df1, df2], axis=1)
2. 数据库式合并(merge)
left = pd.DataFrame({'key': ['K0', 'K1'], 'value': [1, 2]})
right = pd.DataFrame({'key': ['K0', 'K2'], 'value': [3, 4]})
# 内连接
inner_join = pd.merge(left, right, on='key', how='inner')
# 左连接
left_join = pd.merge(left, right, on='key', how='left')
# 多键合并
multi_join = pd.merge(left, right, on=['key1', 'key2'])
3. 简单合并(join)
# 基于索引的合并
left_idx = left.set_index('key')
right_idx = right.set_index('key')
joined = left_idx.join(right_idx, how='outer')
七、数据重塑与变形
1. 堆叠与解堆叠
# 长宽格式转换
df_long = pd.DataFrame({'ID': [1, 1, 2],
'Var': ['A', 'B', 'A'],
'Val': [10, 20, 30]})
# 宽格式转换
df_wide = df_long.pivot(index='ID', columns='Var', values='Val')
# 堆叠操作
stacked = df_wide.stack()
# 解堆叠操作
unstacked = stacked.unstack()
2. 列值展开(melt)
id_vars = ['ID']
value_vars = ['A', 'B']
melted = pd.melt(df_wide,
id_vars=id_vars,
value_vars=value_vars,
var_name='Variable',
value_name='Measurement')
3. 分割列与合并列
# 分割列
df['Full_Name'] = ['Alice Smith', 'Bob Johnson']
df[['First', 'Last']] = df['Full_Name'].str.split(' ', expand=True)
# 合并列
df['Name_City'] = df['Name'] + ' - ' + df['City']
八、时间序列处理
1. 日期时间索引
# 创建时间序列
dates = pd.date_range('20230101', periods=6)
ts = pd.Series(np.random.randn(6), index=dates)
# 重采样
monthly = ts.resample('M').mean()
# 滚动窗口计算
rolling_mean = ts.rolling(window=2).mean()
2. 时间偏移量
# 时间偏移
next_month = ts.index + pd.offsets.MonthBegin(1)
# 时区转换
ts_utc = ts.tz_localize('UTC')
ts_local = ts_utc.tz_convert('America/New_York')
九、性能优化技巧
1. 分块处理大数据
# 分块读取CSV
chunk_size = 10000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)
for chunk in chunks:
process(chunk) # 处理每个数据块
2. 类别数据优化
# 将字符串列转换为类别类型
df['Category'] = df['Category'].astype('category')
# 查看内存使用
print(df.memory_usage(deep=True))
3. 多进程处理
from multiprocessing import Pool
def process_chunk(chunk):
return chunk.groupby('Col').size()
if __name__ == '__main__':
with Pool(4) as p:
results = p.map(process_chunk, chunks)
十、可视化集成
1. 基本绘图
%matplotlib inline
import matplotlib.pyplot as plt
df.plot(x='Name', y='Age', kind='bar')
plt.title('Age Distribution')
plt.show()
2. Seaborn集成
import seaborn as sns
sns.boxplot(x='City', y='Age', data=df)
plt.xticks(rotation=45)
3. 交互式可视化
from plotly.express import bar
fig = bar(df, x='Name', y='Age', color='City')
fig.show()
十一、实际应用案例
1. 销售数据分析
# 加载销售数据
sales = pd.read_csv('sales.csv', parse_dates=['Order_Date'])
# 按月份聚合
monthly_sales = sales.resample('M', on='Order_Date').agg({
'Quantity': 'sum',
'Unit_Price': 'mean'
})
# 可视化趋势
monthly_sales.plot(secondary_y='Unit_Price')
2. 文本数据分析
# 加载文本数据
reviews = pd.read_csv('reviews.csv')
# 词频统计
word_counts = reviews['Text'].str.split().explode().value_counts()
# 情感分析
from textblob import TextBlob
reviews['Sentiment'] = reviews['Text'].apply(
lambda x: TextBlob(x).sentiment.polarity)
3. 金融时间序列分析
# 加载股票数据
stocks = pd.read_csv('stock_prices.csv', index_col='Date', parse_dates=True)
# 计算收益率
returns = stocks['Close'].pct_change()
# 滚动波动率
volatility = returns.rolling(window=20).std()
关键词:pandas库、DataFrame、数据清洗、数据聚合、数据合并、时间序列、可视化、性能优化
简介:本文系统介绍了pandas库中DataFrame数据结构的核心操作,涵盖数据创建、索引选择、清洗转换、统计分析、合并连接、时间序列处理等关键技术,结合代码示例展示了从基础到进阶的完整数据分析流程,适用于金融、电商、文本分析等领域的实际应用场景。