【问题标题】:Dropping rows in dataframe based on row value根据行值删除数据框中的行
【发布时间】:2025-12-25 23:10:10
【问题描述】:

我有一些 word 文档在读入数据帧之前变成了字符串。每个数据框只有一列宽,但多行长。它们看起来都像这样:

0| this document is a survey
1| please fill in fully
2| Send back to address on the bottom of the sheet
etc....

每个数据帧的开头都是乱码,我不需要,所以我需要删除包含值“问题”的行之前的所有行。但是它并不位于每个数据帧的相同索引上,所以我不能只删除前 20 行,因为它会对每个数据帧产生不同的影响。

如何删除每个数据框中“问题”之前的所有行

【问题讨论】:

  • 你们为什么不提供一个具有预期输出的可重现示例...这样您可以让更多人回答您的问题。我们不是来为您制作数据的。

标签: python pandas dataframe


【解决方案1】:

假设您只需要在第一次出现“问题”后保留行,那么这种方法应该可以解决问题:

虚拟数据和设置

import pandas as pd

data = {
    'x': [
          'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'
    ]
}

df = pd.DataFrame(data)
df

输出:

    x
0   a
1   b
2   c
3   d
4   e
5   f
6   g
7   h
8   i
9   j
10  k

解决方案

在这里,我将保留第一次出现以字母“f”开头的条目之后的所有行:

df[df.x.str.startswith('f').cumsum() > 0]

输出:

    x
5   f
6   g
7   h
8   i
9   j
10  k

说明

该解决方案依赖于pandas 的两个主要功能:

  1. pd.DataFrame().str.startswith,为任何以给定字符串开头的单元格获取一个带有 True 的布尔数组(本例中为“f”,但“问题”也可以)。
  2. cumsum() 会将布尔值转换为整数,从而确保第一次出现后的所有行都大于零。

通过使用这些索引原始数据帧,我们得到了解决方案。

【讨论】:

    【解决方案2】:

    另一种选择是使用str.contains()。使用玩具熊猫系列:

    import pandas as pd
    
    # create dataframe
    d = ["nothing", "target is here", "help", "more_words"]
    df = pd.Series(data=d)
    

    如果您想在单词之后保留所有行(包括),请说“这里”,您可以这样做:

    # check rows to determine whether they contain "here"
    keyword_bool = df.str.contains("here", regex=False) 
    # return index as int
    idx = keyword_bool[keyword_bool==True].index[0] 
    
    # slice dataframe
    df = df.iloc[idx:]
    

    【讨论】: