You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按特定条件高效排序Pandas DataFrame中的两列

Pandas DataFrame 按组交换A/B列值的高效实现方案

兄弟,我懂你不想用遍历数组这种低效方法的心情,毕竟Pythonic的写法才是正道!针对你这个两行一组、需要调整A/B列值的需求,我给你准备了一个完全基于Pandas内置功能的高效方案,完美适配你的规则,还能处理None的特殊情况。

核心逻辑梳理

首先明确你的需求:

  • 两行一组构成“实体”,YN列顺序必须保持不变
  • YN为N的行(偶数索引)要存放>100的大数,YN为Y的行(奇数索引)存放<100的小数
  • None值的判定规则:同组配对值小则视为大数,配对值大则视为小数

我们可以利用Pandas的groupby分组功能,按两行一组进行处理,避免手动遍历数组,同时用向量化的逻辑判断值的大小并交换。

完整代码实现

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'YN': ['N', 'Y']*10,
    'A': [150, 5, 168, 3, 7, 145, None, 4, None, 167],
    'B': [134, 4, 3, 123, 3, 143, 134, 2, 145, 1]
})

def adjust_group(group):
    # 定义判断是否为大数的辅助函数,适配None的特殊情况
    def is_large(x, pair):
        if pd.notna(x):
            return x > 100
        # None的情况:配对值小于100则视为大数,否则视为小数
        return pair < 100
    
    # 处理A列:判断是否需要交换N/Y行的值
    a_n, a_y = group['A'].iloc[0], group['A'].iloc[1]
    a_n_is_large = is_large(a_n, a_y)
    a_y_is_small = not is_large(a_y, a_n)
    if not (a_n_is_large and a_y_is_small):
        group['A'].iloc[0], group['A'].iloc[1] = a_y, a_n
    
    # 处理B列:逻辑和A列完全一致
    b_n, b_y = group['B'].iloc[0], group['B'].iloc[1]
    b_n_is_large = is_large(b_n, b_y)
    b_y_is_small = not is_large(b_y, b_n)
    if not (b_n_is_large and b_y_is_small):
        group['B'].iloc[0], group['B'].iloc[1] = b_y, b_n
    
    return group

# 按两行一组分组(用索引//2生成组ID),应用调整逻辑
df = df.groupby(df.index // 2).apply(adjust_group).reset_index(drop=True)

# 查看结果
print(df)

方案优势

  1. Pythonic且高效:完全利用Pandas优化过的groupby机制,避免了Python级别的循环,比手动遍历数组效率高得多
  2. 规则全覆盖:完美适配你提出的大数/小数规则,包括None值的特殊判定逻辑
  3. YN列完全保留:只修改A、B列的值,YN列的顺序和内容全程不变
  4. 代码易读易维护:逻辑清晰,辅助函数和分组处理的结构一目了然,后续调整规则也很方便

内容的提问来源于stack exchange,提问作者Roberto Corral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:57:50