如何基于Pandas DataFrame分组顶部值替换指定列数据
问题解决:按组替换Pandas DataFrame列值
需求说明
现有一个Pandas DataFrame,数据按空行分为多组:
- 每组首行的
product列存储支付类型(如credit、cash、transfer) - 组内后续行的
purchase列需要替换为该组首行的支付类型
输入示例
| product | purchase | price |
|---|---|---|
| credit | ||
| toy | cash | £20 |
| electronics | cash | £50 |
| groceries | cash | £80 |
| gaming | cash | £30 |
| cash | ||
| toy | credit | £20 |
| electronics | credit | £50 |
| groceries | credit | £80 |
| gaming | credit | £30 |
| transfer | ||
| toy | cash | £20 |
| electronics | cash | £50 |
| groceries | cash | £80 |
| gaming | cash | £30 |
输出示例
| product | purchase | price |
|---|---|---|
| credit | ||
| toy | credit | £20 |
| electronics | credit | £50 |
| groceries | credit | £80 |
| gaming | credit | £30 |
| cash | ||
| toy | cash | £20 |
| electronics | cash | £50 |
| groceries | cash | £80 |
| gaming | cash | £30 |
| transfer | ||
| toy | transfer | £20 |
| electronics | transfer | £50 |
| groceries | transfer | £80 |
| gaming | transfer | £30 |
解决方案代码
import pandas as pd # 创建示例DataFrame(实际场景可替换为读取你的数据源) df = pd.DataFrame({ 'product': ['credit', 'toy', 'electronics', 'groceries', 'gaming', '', 'cash', 'toy', 'electronics', 'groceries', 'gaming', '', 'transfer', 'toy', 'electronics', 'groceries', 'gaming'], 'purchase': ['', 'cash', 'cash', 'cash', 'cash', '', '', 'credit', 'credit', 'credit', 'credit', '', '', 'cash', 'cash', 'cash', 'cash'], 'price': ['', '£20', '£50', '£80', '£30', '', '', '£20', '£50', '£80', '£30', '', '', '£20', '£50', '£80', '£30'] }) # 1. 生成分组ID:以空行为分隔标记各组 df['group_id'] = df['product'].eq('').cumsum() # 2. 提取每组对应的支付类型(每组首行的product值) payment_types = df[df['purchase'].eq('')]['product'].tolist() payment_map = dict(zip(df['group_id'].unique(), payment_types)) # 3. 替换purchase列:仅替换非首行的内容 df['purchase'] = df.apply( lambda row: payment_map[row['group_id']] if row['purchase'] != '' else row['purchase'], axis=1 ) # 4. 删除临时分组列 df = df.drop('group_id', axis=1) # 查看结果 print(df)
代码逻辑解释
- 标记分组:通过判断
product列是否为空字符串,累加生成唯一的组ID,把空行作为分组的分隔点。 - 建立支付类型映射:筛选出每组首行(
purchase为空的行)的product值,将组ID和对应支付类型关联成字典。 - 替换目标列:遍历每行,若当前行的
purchase不为空,就用对应组的支付类型替换;首行保持原空值不变。 - 清理临时数据:移除用于分组的
group_id列,得到最终结果。
内容的提问来源于stack exchange,提问作者user19795989
相关产品推荐
相关产品推荐

