Python Pandas行合并:为子类别项添加前缀并规整DataFrame
问题
我用pd.read_excel()读取了如下结构的DataFrame:
NAME Month1 Month2 1 Mean all 1386.16 1350.02 2 Mean NaN NaN 3 Subcategory1 1369.18 1288.48 4 Subcategory2 1271.26 1270.59 5 Subcategory3 2940.74 3042.16 6 Subcategory1 NaN NaN 7 item1 1326.99 1280.72 8 item2 1060.62 1053.34 9 item3 4189.45 4280.25 10 item4 1214.41 1213.15 11 Subactegory2 NaN NaN 12 item1 1326.99 1280.72 13 item2 1060.62 1053.34 14 item3 4189.45 4280.25 15 item4 1214.41 1213.15 16 Subcategory3 NaN NaN 17 item1 1326.99 1280.72 18 item2 1060.62 1053.34 19 item3 4189.45 4280.25
希望将子类别字符串添加到其下方对应项的名称中,最终得到如下规整后的DataFrame:
NAME Month1 Month2 1 Mean all 1386.16 1350.02 2 Mean Subcategory1 1369.18 1288.48 3 Mean Subcategory2 1271.26 1270.59 4 Mean Subcategory3 2940.74 3042.16 5 Subcategory1 item1 1326.99 1280.72 6 Subcategory1 item2 1060.62 1053.34 7 Subcategory1 item3 4189.45 4280.25 8 Subcategory1 item4 1214.41 1213.15 9 Subcategory2 item1 1326.99 1280.72 10 Subcategory2 item2 1060.62 1053.34 11 Subcategory2 item3 4189.45 4280.25 12 Subcategory2 item4 1214.41 1213.15 13 Subcategory3 item1 1326.99 1280.72 14 Subcategory3 item2 1060.62 1053.34 15 Subcategory3 item3 4189.45 4280.25
解决方案
可以通过以下步骤实现数据规整:
步骤1:处理均值行的命名
先把原始DataFrame中Subcategory的均值行(第3-5行)的NAME字段修改为Mean + 子类别名称:
import pandas as pd # 假设df是读取后的DataFrame df.loc[df['NAME'].str.startswith('Subcategory') & df['Month1'].notna(), 'NAME'] = 'Mean ' + df['NAME']
步骤2:标记并填充子类别到对应item行
针对那些NAME为Subcategory且Month列为空的行,创建辅助列并向下填充子类别名称到下面的item行:
# 创建子类别辅助列,标记子类别行 df['subcategory'] = df['NAME'].where(df['NAME'].str.startswith('Subcategory') & df['Month1'].isna()) # 向下填充子类别名称到后续行 df['subcategory'] = df['subcategory'].ffill()
步骤3:合并子类别与item名称,过滤无效行
把subcategory列和item的NAME合并,同时过滤掉不需要的行(单独的"Mean"行、原始的子类别空行):
# 对item行合并名称 mask_item = df['NAME'].str.startswith('item') df.loc[mask_item, 'NAME'] = df['subcategory'] + ' ' + df['NAME'] # 过滤掉无效行:单独的Mean行、子类别空行 df_clean = df[~((df['NAME'] == 'Mean') | (df['NAME'].str.startswith('Subcategory') & df['Month1'].isna()))].copy()
步骤4:重置索引
最后重置索引,让结果和期望格式一致:
df_clean = df_clean.reset_index(drop=True) # 调整索引从1开始(可选,和示例格式匹配) df_clean.index = df_clean.index + 1
执行完以上步骤后,就能得到你需要的规整后DataFrame。
内容的提问来源于stack exchange,提问作者katop
相关产品推荐
相关产品推荐

