如何基于过滤条件修改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
相关产品推荐
相关产品推荐

