文章目录
- 字典式访问:通过列名直接获取Series对象 import pandas as pd df = pd.DataFrame({‘A’: [1, 2], ‘B’: [‘x’, ‘y’]}) col_a = df[‘A’] # 返回Series 属性访问(仅限列名符合变量命名规则时): col_a = df.A # 等效于df[‘A’],但列名含空格或特殊字符时会报错
- .loc[]:按标签索引(包含末端) df = pd.DataFrame({‘A’: [1, 2, 3]}, index=[‘a’, ‘b’, ‘c’]) print(df.loc[‘a’:’b’]) # 输出行’a’和’b’ .iloc[]:按位置索引(不包含末端) print(df.iloc[0:2]) # 输出前两行(位置0和1) 混合索引:同时访问行和列 print(df.loc[‘a’, ‘A’]) # 输出行’a’列’A’的值(1) print(df.iloc[0, 0]) # 等效操作(位置索引)
- 布尔索引:通过条件表达式筛选 df = pd.DataFrame({‘A’: [1, 2, 3], ‘B’: [‘x’, ‘y’, ‘z’]}) result = df[df[‘A’] > 1] # 筛选A列值大于1的行 .query()方法:字符串形式编写条件(适合复杂条件) result = df.query(‘A > 1 and B != “z”‘) # 筛选A>1且B≠’z’的行
- 创建多级索引DataFrame: arrays = [[‘A’, ‘A’, ‘B’, ‘B’], [1, 2, 1, 2]] index = pd.MultiIndex.from_arrays(arrays, names=(‘Letter’, ‘Number’)) df = pd.DataFrame({‘Data’: [10, 20, 30, 40]}, index=index) 访问特定层级数据: print(df.loc[‘A’]) # 筛选Letter=’A’的所有行 print(df.loc[(‘A’, 1)]) # 精确筛选Letter=’A’且Number=1的行 print(df.xs(‘A’, level=’Letter’)) # 使用xs方法按层级筛选
- 添加列: df[‘C’] = [True, False, True] # 直接赋值 df[‘D’] = df[‘A’] * 2 # 通过运算生成新列 添加行: 使用loc扩展索引: df.loc[3] = [4, ‘w’, False, 8] # 添加新行(索引为3) 使用append(已弃用,推荐pd.concat): new_row = pd.DataFrame({‘A’: [5], ‘B’: [‘v’]}) df = pd.concat([df, new_row], ignore_index=True)
- 删除列: df.drop(‘C’, axis=1, inplace=True) # 删除列’C’ 删除行: df.drop([0, 2], axis=0, inplace=True) # 删除索引为0和2的行 条件删除: df = df[df[‘A’] != 2] # 删除A列值为2的行
- 单值修改: df.loc[0, ‘A’] = 100 # 修改索引0行A列的值为100 批量替换: df[‘A’].replace(100, 1000, inplace=True) # 将A列所有100替换为1000 按条件替换: df[‘A’] = df[‘A’].apply(lambda x: x * 2 if x > 1 else x) # A列值>1时乘以2
- pivot:将长格式数据转换为宽格式 data = {‘Date’: [‘2023-01-01’, ‘2023-01-01’, ‘2023-01-02’], ‘Category’: [‘A’, ‘B’, ‘A’], ‘Value’: [10, 20, 30]} df = pd.DataFrame(data) pivot_df = df.pivot(index=’Date’, columns=’Category’, values=’Value’) pivot_table:支持聚合的透 视表 pivot_table_df = df.pivot_table(index=’Date’, columns=’Category’, values=’Value’, aggfunc=’mean’)
- melted_df = pd.melt(pivot_df, var_name=’Category’, value_name=’Value’)
- merge:类似SQL的连接操作 left = pd.DataFrame({‘Key’: [‘A’, ‘B’], ‘Value1’: [1, 2]}) right = pd.DataFrame({‘Key’: [‘A’, ‘B’], ‘Value2′: [3, 4]}) merged_df = pd.merge(left, right, on=’Key’, how=’inner’) # 内连接 join:基于索引的快速合并 left.set_index(‘Key’, inplace=True) right.set_index(‘Key’, inplace=True) joined_df = left.join(right, how=’left’) # 左连接
- 按值排序: df.sort_values(‘A’, ascending=False, inplace=True) # 按A列降序排序 按索引排序: df.sort_index(inplace=True) # 按行索引排序
- 基础分组计算: df = pd.DataFrame({‘Category’: [‘A’, ‘B’, ‘A’, ‘B’], ‘Value’: [10, 20, 30, 40]}) grouped = df.groupby(‘Category’)[‘Value’].agg([‘sum’, ‘mean’, ‘count’]) 多列分组: df[‘Subcategory’] = [‘X’, ‘Y’, ‘X’, ‘Y’] multi_grouped = df.groupby([‘Category’, ‘Subcategory’])[‘Value’].sum()
- 滚动计算: df = pd.DataFrame({‘Value’: [1, 2, 3, 4, 5]}) df[‘Rolling_Mean’] = df[‘Value’].rolling(window=3).mean() # 3期移动平均 扩展计算: df[‘Expanding_Sum’] = df[‘Value’].expanding().sum() # 累计求和
- transform:返回与分组大小相同的Series df[‘Group_Mean’] = df.groupby(‘Category’)[‘Value’].transform(‘mean’) apply:自定义聚合函数 def custom_agg(x): return x.max() – x.min() df[‘Value_Range’] = df.groupby(‘Category’)[‘Value’].apply(custom_agg)
- 生成时间索引: dates = pd.date_range(‘2023-01-01′, periods=5, freq=’D’) df = pd.DataFrame({‘Value’: [1, 2, 3, 4, 5]}, index=dates) 时间重采样: df.resample(‘W’).sum() # 按周汇总
- 列级字符串操作: df = pd.DataFrame({‘Text’: [‘apple’, ‘banana’, ‘cherry’]}) df[‘Text_Length’] = df[‘Text’].str.len() # 计算字符串长度 df[‘Text_Upper’] = df[‘Text’].str.upper() # 转换为大写
- 转换为分类类型: df[‘Category’] = df[‘Category’].astype(‘category’) 获取分类信息: print(df[‘Category’].cat.categories) # 输出所有类别 print(df[‘Category’].cat.codes) # 输出类别编码
- 使用categorical减少内存: df[‘Category’] = df[‘Category’].astype(‘category’) # 尤其适合低基数列 避免链式操作: # 不推荐(可能引发SettingWithCopyWarning) df[df[‘A’] > 1][‘B’] = 0 # 推荐 mask = df[‘A’] > 1 df.loc[mask, ‘B’] = 0 使用eval加速计算(适合大型DataFrame): df.eval(‘C = A * B’, inplace=True) # 比直接赋值更快
目录
- 一、数据访问:精准定位数据的N种方式
- 1.列访问:直接索引与属性访问
- 2.行访问:标签索引与位置索引
- 3.条件筛选:布尔索引与查询函数
- 4.多级索引访问:Hierarchical Indexing
- 二、数据修改:增删改查的全流程控制
- 1.添加数据:列与行的扩展
- 2.删除数据:列与行的移除
- 3.修改数据:精准更新与批量替换
- 三、数据转换:重塑与重构数据结构
- 1.数据透 视:pivot与pivot_table
- 2.熔化数据:melt(宽转长)
- 3.数据合并:merge与join
- 4.数据排序:sort_values与sort_index
- 四、数据聚合:分组计算与统计分析
- 1.分组聚合:groupby
- 2.窗口函数:rolling与expanding
- 3.高级聚合:transform与apply
- 五、高级操作:超越基础的数据处理
- 1.时间序列处理
- 2.文本处理:字符串方法
- 3.分类数据:astype('category')
- 4.性能优化技巧
- 六、总结:DataFrame操作的核心原则
DataFrame作为Pandas的核心数据结构,其数据操作能力覆盖了从基础访问到高级分析的全场景。本文将系统梳理DataFrame的数据访问、筛选、转换、聚合和高级操作五大核心能力,结合代码示例和性能优化技巧,帮助读者全面掌握这一数据分析利器。
字典式访问:通过列名直接获取Series对象
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': ['x', 'y']})
col_a = df['A'] # 返回Series
属性访问(仅限列名符合变量命名规则时):
col_a = df.A # 等效于df['A'],但列名含空格或特殊字符时会报错
.loc[]:按标签索引(包含末端)
df = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
print(df.loc['a':'b']) # 输出行'a'和'b'
.iloc[]:按位置索引(不包含末端)
print(df.iloc[0:2]) # 输出前两行(位置0和1)
混合索引:同时访问行和列
print(df.loc['a', 'A']) # 输出行'a'列'A'的值(1) print(df.iloc[0, 0]) # 等效操作(位置索引)
布尔索引:通过条件表达式筛选
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'z']})
result = df[df['A'] > 1] # 筛选A列值大于1的行
.query()方法:字符串形式编写条件(适合复杂条件)
result = df.query('A > 1 and B != "z"') # 筛选A>1且B≠'z'的行
创建多级索引DataFrame:
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('Letter', 'Number'))
df = pd.DataFrame({'Data': [10, 20, 30, 40]}, index=index)
访问特定层级数据:
print(df.loc['A']) # 筛选Letter='A'的所有行
print(df.loc[('A', 1)]) # 精确筛选Letter='A'且Number=1的行
print(df.xs('A', level='Letter')) # 使用xs方法按层级筛选
添加列:
df['C'] = [True, False, True] # 直接赋值 df['D'] = df['A'] * 2 # 通过运算生成新列
添加行:
使用loc扩展索引:
df.loc[3] = [4, 'w', False, 8] # 添加新行(索引为3)
使用append(已弃用,推荐pd.concat):
new_row = pd.DataFrame({'A': [5], 'B': ['v']})
df = pd.concat([df, new_row], ignore_index=True)
删除列:
df.drop('C', axis=1, inplace=True) # 删除列'C'
删除行:
df.drop([0, 2], axis=0, inplace=True) # 删除索引为0和2的行
条件删除:
df = df[df['A'] != 2] # 删除A列值为2的行
单值修改:
df.loc[0, 'A'] = 100 # 修改索引0行A列的值为100
批量替换:
df['A'].replace(100, 1000, inplace=True) # 将A列所有100替换为1000
按条件替换:
df['A'] = df['A'].apply(lambda x: x * 2 if x > 1 else x) # A列值>1时乘以2
pivot:将长格式数据转换为宽格式
data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-02'],
'Category': ['A', 'B', 'A'],
'Value': [10, 20, 30]}
df = pd.DataFrame(data)
pivot_df = df.pivot(index='Date', columns='Category', values='Value')
pivot_table:支持聚合的透 视表
pivot_table_df = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='mean')
melted_df = pd.melt(pivot_df, var_name='Category', value_name='Value')
merge:类似SQL的连接操作
left = pd.DataFrame({'Key': ['A', 'B'], 'Value1': [1, 2]})
right = pd.DataFrame({'Key': ['A', 'B'], 'Value2': [3, 4]})
merged_df = pd.merge(left, right, on='Key', how='inner') # 内连接
join:基于索引的快速合并
left.set_index('Key', inplace=True)
right.set_index('Key', inplace=True)
joined_df = left.join(right, how='left') # 左连接
按值排序:
df.sort_values('A', ascending=False, inplace=True) # 按A列降序排序
按索引排序:
df.sort_index(inplace=True) # 按行索引排序
基础分组计算:
df = pd.DataFrame({'Category': ['A', 'B', 'A', 'B'],
'Value': [10, 20, 30, 40]})
grouped = df.groupby('Category')['Value'].agg(['sum', 'mean', 'count'])
多列分组:
df['Subcategory'] = ['X', 'Y', 'X', 'Y'] multi_grouped = df.groupby(['Category', 'Subcategory'])['Value'].sum()
滚动计算:
df = pd.DataFrame({'Value': [1, 2, 3, 4, 5]})
df['Rolling_Mean'] = df['Value'].rolling(window=3).mean() # 3期移动平均
扩展计算:
df['Expanding_Sum'] = df['Value'].expanding().sum() # 累计求和
transform:返回与分组大小相同的Series
df['Group_Mean'] = df.groupby('Category')['Value'].transform('mean')
apply:自定义聚合函数
def custom_agg(x):
return x.max() - x.min()
df['Value_Range'] = df.groupby('Category')['Value'].apply(custom_agg)
生成时间索引:
dates = pd.date_range('2023-01-01', periods=5, freq='D')
df = pd.DataFrame({'Value': [1, 2, 3, 4, 5]}, index=dates)
时间重采样:
df.resample('W').sum() # 按周汇总
列级字符串操作:
df = pd.DataFrame({'Text': ['apple', 'banana', 'cherry']})
df['Text_Length'] = df['Text'].str.len() # 计算字符串长度
df['Text_Upper'] = df['Text'].str.upper() # 转换为大写
转换为分类类型:
df['Category'] = df['Category'].astype('category')
获取分类信息:
print(df['Category'].cat.categories) # 输出所有类别 print(df['Category'].cat.codes) # 输出类别编码
使用categorical减少内存:
df['Category'] = df['Category'].astype('category') # 尤其适合低基数列
避免链式操作:
# 不推荐(可能引发SettingWithCopyWarning) df[df['A'] > 1]['B'] = 0 # 推荐 mask = df['A'] > 1 df.loc[mask, 'B'] = 0
使用eval加速计算(适合大型DataFrame):
df.eval('C = A * B', inplace=True) # 比直接赋值更快
- 向量化优先:尽量避免逐行循环,优先使用Pandas内置的向量化操作。
- 链式操作谨慎:复杂的链式操作可能引发警告或错误,建议拆分为多步。
- 内存效率:对大型数据集,优先使用
categorical类型和chunksize分块处理。
- 索引设计:合理设计索引(如时间索引、多级索引)可显著提升查询效率。
categorical类型和chunksize分块处理。掌握这些操作后,DataFrame将不再仅仅是数据容器,而是能高效完成数据清洗、转换、分析和可视化的全能工具。无论是处理百万级数据集还是复杂分析场景,DataFrame都能通过简洁的语法实现强大的功能。
以上就是从基础到高级解析Pandas DataFrame数据操作的完整指南的详细内容,更多关于Pandas DataFrame数据操作的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Pandas DataFrame数据合并与连接的完整指南
- Pandas中DataFrame进行数据处理的完整指南
- Pandas DataFrame进行数据拼接方法详解
- Pandas数据结构DataFrame使用方式
- Pandas DataFrame 筛选数据几种方法实现
- Pandas DataFrame添加一行数据的几种方法