如何对DataFrame内的独立数据块进行微型转置?
解决方案
步骤说明
原数据的规律是每5行一组:第1行是公司名称行,后续4行对应各金额列的数值。我们可以通过分组提取、赋值的方式实现需求:
- 标记分组:识别公司名称行,以此为依据将数据按5行一组划分
- 提取金额:每个分组内,把后续4行的金额值提取出来,对应赋值到公司行的各列
- 筛选结果:只保留每个分组的公司行,得到最终结构
代码实现
import pandas as pd # 假设你的原始DataFrame为df # 1. 标记公司行:通过是否包含$符号反向判断(金额行均带$) df['is_company'] = ~df['Company Name'].str.contains('\$') # 2. 创建分组ID:每遇到一个公司行,分组号递增 df['group_id'] = df['is_company'].cumsum() # 3. 分组处理:提取每组内的金额并赋值给公司行 def process_group(group): # 取出组内第一行(公司行) company_row = group.iloc[[0]].copy() # 提取组内后4行的金额值,对应赋值到各列 amounts = group.iloc[1:5]['Company Name'].tolist() company_row['Total Amount Due'] = amounts[0] company_row['0-10 days'] = amounts[1] company_row['10-20 days'] = amounts[2] company_row['20-30 days'] = amounts[3] return company_row # 批量处理所有分组,合并结果 result_df = df.groupby('group_id').apply(process_group).reset_index(drop=True) # 清理辅助列 result_df = result_df.drop(['is_company', 'group_id'], axis=1) print(result_df)
代码解释
~df['Company Name'].str.contains('\$'):反向筛选出不含$的公司名称行df['is_company'].cumsum():累积计数公司行,生成每个5行组的唯一标识process_group函数:对每个分组单独处理,提取后4行的金额值覆盖公司行的对应列- 最后通过
groupby.apply批量处理所有分组,得到目标结构
内容的提问来源于stack exchange,提问作者user19891327
相关产品推荐
相关产品推荐

