【问题标题】:Python - Exclude rows by checking strings in other columnsPython - 通过检查其他列中的字符串来排除行
【发布时间】:2021-07-05 04:30:05
【问题描述】:

问题有点长,请多多包涵。

我正在尝试从电子邮件正文中删除不必要的文本,并仅保留第一封电子邮件的正文(问候语之后和签名之前的文本)。

以下是电子邮件示例。

电子邮件:

email = """Hi John,

I am emailing regarding REQ-12345 and REQ-66442.

Many Thanks,

Jane
Analyst | XYZ LLC.
Phone: +00 123 456 7890
Email: Jane.Doe@xyzmail.com
"""

我使用splitlinesstartswith 方法检查每一行的关键字,我想使用这些关键字来决定包含或排除一行的天气。

代码:

flag = []
greet = []
for i in range(len(email.splitlines())):
   
    if email.splitlines()[i].lower().startswith('many thanks'):
        flag.append(False)
    else:
        flag.append(True)
        
    if email.splitlines()[i].lower().startswith('hi') or email.splitlines()[i].lower().startswith('hello'):
        greet.append(False)
    else:
        greet.append(True)

df = pd.DataFrame({'line': email.splitlines(), 'signature_flag': flag, 'greet': greet})
df

给出以下数据框:

我创建了一个名为countX 的函数来检查一个值在列表中出现的次数。

def countX(lst, x): 
    count = 0
    for ele in lst: 
        if (ele == x): 
            count = count + 1
    return count 

使用countX 函数,我试图创建一个列,如果signature_flaggreet 列是False,它应该标记为False,如果False 出现在@ 987654335@ 两次,然后第二次False 之后的任何内容都是False。然后我可以删除所有 False 行,剩下的就是我需要的文本。

final_flag = []
for i in range(len(df)):
    flag = (df['signature_flag'][i] == True & df['greet'][i] == True)
    if countX(final_flag[0:i], False) <= 2:
        final_flag.append(flag)
    else:
        final_flag.append(False)
df['final_flag'] = final_flag
df

但是,这并没有按预期工作。

我如何让它工作?

谢谢。

【问题讨论】:

  • 给定数据帧的预期输出是什么?

标签: python dataframe function


【解决方案1】:

由于您在字符串切片后使用 final_flag,因此您应该使用 i+1 在列表中包含最多 i 个元素。

if countX(final_flag[0:i + 1], False) <= 2:
    final_flag.append(flag)

【讨论】:

  • 嗨@Shubham Chaudhary,刚刚试过这个。但我没有得到想要的结果。
  • 您好,df的长度准确吗?
  • 是的。它基于上面的文字。我解决了这个问题。基本上创建了一个新列,我在其中将两列中任何一个为假的任何内容标记为假,第二个假之后的任何内容都标记为假。过滤掉 True 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多