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

如何基于过滤条件修改Pandas行数据右移方案,仅处理含指定关键词的行

如何基于过滤条件修改Pandas行数据右移方案,仅处理含指定关键词的行

嗨,这个需求其实很好调整!咱们就在你现有的mozway的右移方案基础上,加个行过滤逻辑就行——只对Customer列包含"main"关键词的行应用右移处理,其他行原样保留。

我给你把代码改好,还加了对应的示例数据,完全贴合你说的场景:

首先构造符合你描述的测试数据:

import numpy as np
import pandas as pd

data = {
    'Customer': ['Cucumber.main', 'Strawberry.fruit', 'Tomato.main'],
    'Date1': [10, 20, 30],
    'Date2': [40, 50, np.nan],
    'Date3': [np.nan, np.nan, np.nan],
    'Date4': [60, np.nan, np.nan]
}
df = pd.DataFrame(data)

然后是修改后的核心代码:

# 第一步:标记出需要处理的行——Customer列包含"main"的行
mask = df['Customer'].str.contains('main', case=False, na=False)

# 第二步:把原右移逻辑封装成函数,仅作用在筛选后的行子集上
def shift_right_subset(sub_df):
    return (sub_df
            .set_index('Customer', append=True)
            .pipe(lambda d: d.mask(d.iloc[:, -1].isna(),
                                   d.transform(lambda x: sorted(x, key=pd.notnull), axis=1)
                                   )
                  )
            .reset_index('Customer')
            )

# 第三步:合并处理后的行和未处理的行,得到最终结果
out = df.copy()
out.loc[mask] = shift_right_subset(df.loc[mask]).values

运行这段代码后,你会看到只有Cucumber.main和Tomato.main这两行被右移处理了,Strawberry.fruit完全保持原样,正好符合你的预期。

我给你拆解下关键改动点:

  • 用str.contains生成了一个布尔掩码mask,精准定位需要处理的行;case=False是不区分大小写(如果需要严格区分,去掉这个参数就行),na=False是把空的Customer值排除在处理范围外。
  • 把原来的右移逻辑封装成独立函数,方便单独作用在筛选后的行子集上,避免影响其他行。
  • 最后用out.loc[mask]把处理后的结果赋值回原DataFrame的对应行,确保非目标行的结构和数据完全不受影响。

这样既保留了原方案的高效性,又完美实现了按关键词过滤处理的需求~

备注:内容来源于stack exchange,提问作者teq508

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:57:57