如何在R中重塑含类别与子类别混合列的DataFrame
解决方案
可以用Pandas的ffill()(向前填充)方法结合简单过滤操作实现转换,具体步骤如下:
1. 构造示例数据
先还原你的原始DataFrame:
import pandas as pd import numpy as np data = { 'category': ['A', 'high', 'mid', 'low', 'B', 'high', 'mid', 'low', 'C', 'low'], 'value': [np.nan, 20, 18, 10, np.nan, 22, 12, 11, np.nan, 14] } df = pd.DataFrame(data)
2. 填充父类别值
新增一列存储父类别,利用ffill()将类别行(value为NA的行)的category值向下填充到后续子类别行:
# 新增父类别列并填充 df['parent_category'] = df.loc[df['value'].isna(), 'category'].ffill()
3. 过滤并调整结构
过滤掉原始的类别行(value为NA的行),再重命名列并调整顺序:
# 过滤掉空值行 result_df = df[~df['value'].isna()].copy() # 重命名列并调整顺序 result_df.rename(columns={'category': 'subcategory', 'parent_category': 'category'}, inplace=True) result_df = result_df[['category', 'subcategory', 'value']].reset_index(drop=True)
运行后result_df即为目标结构:
category subcategory value 0 A high 20.0 1 A mid 18.0 2 A low 10.0 3 B high 22.0 4 B mid 12.0 5 B low 11.0 6 C low 14.0
补充说明
- 如果原始数据中
value的NA是字符串'NA'而非numpy的NaN,需先转为真正的缺失值:df['value'] = pd.to_numeric(df['value'], errors='coerce') ffill()会自动将最近的非空值向下填充,完美适配类别行在前、子类别行在后的结构
内容的提问来源于stack exchange,提问作者opposity
相关产品推荐
相关产品推荐

