【问题标题】:Remove row with spesific value in pandas dataframe [duplicate]删除熊猫数据框中具有特定值的行[重复]
【发布时间】:2019-11-12 01:54:28
【问题描述】:

我有一个这样的数据框:

value1       value2
aa7bbc       aaaa
ss           ss0
qqq          wwww
nn77         qqee

我想删除以下行:

  • 有数字值
  • nn开头
  • 少于两个字符

我试过了:

df[~df.value1.str.contains(r'\d')]

但这并不能涵盖我需要的一切。解决这个问题的最有效方法是什么?

非常感谢

【问题讨论】:

  • 这是什么意思 - has fewer than two characters?

标签: python python-3.x pandas dataframe


【解决方案1】:

您只需要使用 OR 优化您的正则表达式以匹配任何条件。

r'(\d)|(^nn)|(^.?$)'

这是:

\d 表示包含的数字

^nn 以 nn 开头

^.?$ 用于 0-1 个字符(少于两个字符)。

试试这个:

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO("""
value1       value2
aa7bbc       aaaa
ss           ss0
qqq          wwww
nn77         qqee"""), sep=r"\s+")

df = df[~df.value1.str.contains(r'(\d)|(^nn)|(^.?$)')]

print(df)

输出:

  value1 value2
1     ss    ss0
2    qqq   wwww

【讨论】:

    【解决方案2】:

    使用运算符根据条件进行过滤

        df[ (~df.value1.str.contains(r'\d')) & (df.value1.str.len() < 2) & (df.value1.str.startswith('nn') ]
    

    【讨论】:

      【解决方案3】:
      def has_digit(str):
           return any(char.isdigit() for char in str)
      
      new_df=df[len(df['value1'])>=2 and not df['value1'].startswith("nn") and not has_digit(df['value1'])]
      

      【讨论】:

        【解决方案4】:

        这是一种方法:

        mask_no_digit =( ~df.value1.str.contains(r'\d')) & (~df.value2.str.contains(r'\d'))
        mask_no_nn = (~df['value1'].str.startswith('nn')) & (~df['value2'].str.startswith('nn'))
        mask_no_2_characters = (~df['value1'].str.len()<=2 ) & (~df['value2'].str.len()<=2)
        
        df[mask_no_digit & mask_no_nn & mask_no_2_characters]
        

        输出:

          value1 value2
        2    qqq   wwww
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-16
          • 2017-09-27
          • 2017-09-27
          • 2021-04-01
          • 2021-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多