
在数据分析和报表生成过程中,我们经常会遇到这样的需求:给定一个数据集,其中包含按某些关键字段(如“姓名”、“部门”)分组的数据,并且每个分组应包含一个预定义的所有可能“类型”的完整集合。然而,原始数据可能由于各种原因导致某些分组缺少特定“类型”的行。例如,在一个销售数据集中,我们希望确保每个销售员(按姓名分组)都包含所有产品类别(“类型”),即使某个销售员在某个类别下没有销售记录。对于这些缺失的行,我们通常需要创建它们,并用默认值(如0)填充其数值列,以保证数据结构的完整性和后续分析的准确性。
考虑以下示例数据:
import pandas as pd
data = {
'First Name': ['Alice', 'Alice', 'Alice', 'Alice', 'Bob', 'Bob'],
'Last Name': ['Johnson', 'Johnson', 'Johnson', 'Johnson', 'Jack', 'Jack'],
'Type': ['CA', 'DA', 'FA', 'GCA', 'CA', 'GCA'],
'Value': [25, 30, 35, 40, 50, 37]
}
# 定义所有可能的类型列表
types = ['CA', 'DA', 'FA', 'GCA']
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)在这个例子中,我们希望每个“First Name”和“Last Name”的组合(即每个独立的人)都拥有 types 列表中定义的所有四种“Type”类型。观察数据,Alice Johnson 已经拥有所有四种类型,但 Bob Jack 仅有 CA 和 GCA 两种类型,缺少 DA 和 FA。我们的目标是为 Bob Jack 创建两条新行,分别对应 DA 和 FA 类型,并将它们的 Value 列设置为0。
解决此问题的核心思路是构建一个包含所有分组键与所有可能类型组合的“模板”DataFrame,然后将原始数据左连接到这个模板上。这样,模板中存在但在原始数据中缺失的组合将会在连接后产生 NaN 值,我们随后可以填充这些 NaN 值。
以下是具体的实现步骤和代码:
# 解决方案代码
out = (df[['First Name', 'Last Name']] # 1. 提取唯一的组合键
.drop_duplicates() # 确保每个组合键只出现一次
.merge(pd.Series(types, name='Type'), how='cross') # 2. 与所有类型进行交叉合并,生成模板
.merge(df, on=['First Name', 'Last Name', 'Type'], how='left') # 3. 左连接原始DataFrame
.fillna(0) # 4. 填充缺失值(NaN)为0
# 5. 可选:将'Value'列转换回整数类型,因为fillna可能导致其变为浮点型
.astype({'Value': int})
)
print("\n补齐后的DataFrame:")
print(out)执行上述代码后,我们将得到如下的DataFrame:
First Name Last Name Type Value 0 Alice Johnson CA 25 1 Alice Johnson DA 30 2 Alice Johnson FA 35 3 Alice Johnson GCA 40 4 Bob Jack CA 50 5 Bob Jack DA 0 6 Bob Jack FA 0 7 Bob Jack GCA 37
可以看到,Bob Jack 组合现在包含了 DA 和 FA 两种类型,并且它们的 Value 列已成功填充为0,从而满足了我们的需求。
通过这种组合使用 drop_duplicates、merge(how='cross') 和 merge(how='left') 的策略,我们能够高效且优雅地解决Pandas中补齐分组数据缺失行的问题,确保数据完整性和一致性,为后续的数据分析和建模奠定坚实基础。
以上就是Pandas数据处理:补齐分组数据中缺失的行的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号