如何在Pandas分组后反转指定列并还原为DataFrame?
问题描述
我有一个Pandas DataFrame,已经按Column A列分组排序,Column C列的值是1到n的序列。需要对每个分组反转Column C的顺序,得到目标效果。尝试了分组操作反转,但不知道怎么还原成DataFrame,同时想了解有没有无需分组的实现方式。
当前DataFrame
| Column A | Column B | Column C |
|---|---|---|
| Group 1 | x | 1 |
| Group 1 | y | 2 |
| Group 1 | z | 3 |
| Group 2 | w | 1 |
| Group 2 | x | 2 |
| Group 2 | y | 3 |
| Group 2 | z | 4 |
目标DataFrame
| Column A | Column B | Column C |
|---|---|---|
| Group 1 | x | 3 |
| Group 1 | y | 2 |
| Group 1 | z | 1 |
| Group 2 | w | 4 |
| Group 2 | x | 3 |
| Group 2 | y | 2 |
| Group 2 | z | 1 |
已尝试的代码
df = df.groupby('Column A', sort=False, group_keys=True).apply(lambda row: row['Column C'][::-1])
解决方法
方法一:修复分组操作,还原为DataFrame
你之前的apply只返回了反转后的Column C序列,直接赋值会把原DataFrame替换成多层索引的Series。这里给两种可行的分组实现方式:
使用transform(推荐)
transform会返回和原DataFrame长度一致的结果,直接赋值给Column C就能完成修改,不用额外处理索引:
df['Column C'] = df.groupby('Column A', sort=False)['Column C'].transform(lambda x: x[::-1])
使用apply并重置索引
如果坚持用apply,需要在处理时保留整行数据,之后重置索引去掉分组带来的多层索引:
df = df.groupby('Column A', sort=False, group_keys=False).apply(lambda group: group.assign(Column_C=group['Column C'][::-1])) df = df.reset_index(drop=True)
方法二:无需分组的实现方式
因为每个分组内的Column C是从1开始的连续序列,每个分组的最大值就是该组的总长度。我们可以直接通过数值计算得到反转后的值,完全不用分组操作:
- 先计算每个分组的
Column C最大值:
max_vals = df.groupby('Column A')['Column C'].transform('max')
- 用最大值减去当前
Column C的值再加1,就是反转后的结果:
df['Column C'] = max_vals - df['Column C'] + 1
这种方法效率更高,尤其适合处理大数据集,不用对序列做反转操作,纯数值计算更快。
内容的提问来源于stack exchange,提问作者Martin Wickett
相关产品推荐
相关产品推荐

