如何将Pandas DataFrame分组列中的值替换为前一分组的值
解决方法
要实现将每个分组的A列替换为前一个分组的A值,第一个分组设为NaN的需求,我们可以利用Pandas的分组和映射功能快速完成,这里提供两种实用思路:
方法一:简洁映射法
这种方法代码紧凑,核心是利用分组提取唯一值后直接移位映射,适合快速实现:
import pandas as pd # 构造原数据(替换成你自己的DataFrame即可) data = { 'country': [0,1,2,3,4,5,6,7,8,9,10,11], 'group': [1,1,1,2,2,2,2,2,3,3,3,3], 'A': ['a1','a1','a1','a2','a2','a2','a2','a2','a3','a3','a3','a3'], 'B': [10,11,12,50,51,52,53,50,51,52,53,53], 'C': [20,21,22,60,61,62,63,60,61,62,63,63], 'D': [30,31,32,70,71,72,73,70,71,72,73,73] } df = pd.DataFrame(data) # 1. 提取每个分组的A列唯一值(因每个分组A值统一),移位得到前一个分组的A值 prev_group_a = df.groupby('group')['A'].first().shift() # 2. 将每个group映射到对应前分组的A值,替换原A列 df['A'] = df['group'].map(prev_group_a)
方法二:分步合并法
如果需要清晰追踪每一步的变化,这种分步方式更易理解逻辑:
import pandas as pd # 构造原DataFrame data = { 'country': [0,1,2,3,4,5,6,7,8,9,10,11], 'group': [1,1,1,2,2,2,2,2,3,3,3,3], 'A': ['a1','a1','a1','a2','a2','a2','a2','a2','a3','a3','a3','a3'], 'B': [10,11,12,50,51,52,53,50,51,52,53,53], 'C': [20,21,22,60,61,62,63,60,61,62,63,63], 'D': [30,31,32,70,71,72,73,70,71,72,73,73] } df = pd.DataFrame(data) # 1. 创建分组与A值的映射表 group_a_map = df.groupby('group')['A'].first().reset_index() # 2. 移位生成前一个分组的A值,第一个分组自动变为NaN group_a_map['prev_A'] = group_a_map['A'].shift(1) # 3. 合并映射表到原数据,替换A列并清理临时列 df = df.merge(group_a_map[['group', 'prev_A']], on='group', how='left') df['A'] = df['prev_A'] df.drop('prev_A', axis=1, inplace=True)
两种方法最终都会得到你想要的结果:第一个分组的A列全部变为NaN,group2的A列替换为group1的a1,group3的A列替换为group2的a2。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

