如何在Pandas中按sl. no列的标题对数据进行分组
用Pandas按
sl. No列中的标题分组的方法 你的数据结构里,sl. No列既包含分组标题(如Heading1、Head2),又包含对应分组内的序号行。要实现按这些标题分组,需先给数据行打上分组标签,再进行分组操作,具体步骤如下:
1. 读取数据
先读取CSV/Excel文件,注意保留sl. No列的字符串类型,避免数字序号被自动转换为数值类型,影响后续判断:
import pandas as pd # 读取CSV文件,指定sl. No列为字符串 df = pd.read_csv('your_data.csv', dtype={'sl. No': str}) # 如果是Excel文件,用下面的代码 # df = pd.read_excel('your_data.xlsx', dtype={'sl. No': str})
2. 标记分组标题并填充分组标签
识别出sl. No列中的标题行,然后将标题向下填充,给每一行数据分配对应的分组标签:
# 方法1:通过判断sl. No是否为数字来标记标题行 df['is_heading'] = ~df['sl. No'].str.isdigit() # 方法2:通过判断其他数值列是否全为空来标记标题行(更贴合你的数据格式) # df['is_heading'] = df[['v1','v2','v3','v4']].isna().all(axis=1) # 将标题向下填充,生成分组标签列 df['group'] = df.loc[df['is_heading'], 'sl. No'].ffill()
3. 过滤有效数据行
过滤掉没有实际数据的标题行,只保留需要分组的有效数据:
# 筛选出非标题行 filtered_df = df[~df['is_heading']].copy() # 删除临时的is_heading列 filtered_df.drop('is_heading', axis=1, inplace=True)
4. 执行分组操作
现在可以用groupby对group列进行分组,完成各种分析操作:
# 按分组标签分组 grouped_data = filtered_df.groupby('group') # 示例1:遍历每个分组,查看数据 for group_name, data in grouped_data: print(f"=== 分组:{group_name} ===") print(data) # 示例2:计算每个分组的v1列平均值 group_mean = grouped_data['v1'].mean() print("\n各分组v1列平均值:") print(group_mean) # 示例3:将每个分组保存为单独的CSV文件 for group_name, data in grouped_data: data.to_csv(f"{group_name}_data.csv", index=False)
内容的提问来源于stack exchange,提问作者Hillal Kumar Roy
相关产品推荐
相关产品推荐

