【问题标题】:Delete all rows bellow a certain condition in pandas删除熊猫中特定条件以下的所有行
【发布时间】:2019-03-29 21:30:17
【问题描述】:

我有一个包含多列的数据框。其中一列(在示例中表示为 B)用作触发器,即 我必须在第一个大于 0.5 的值之后删除所有行。但是,我必须保存第一个数字。

上面给出了一个例子。删除 0.59 之后的所有行(即满足大于 0.5 条件的第一行)。

initial_df = pd.DataFrame([[1,0.4], [5,0.43], [4,0.59], [11,0.41], [9,0.61]], columns = ['A', 'B'])

蓝色框表示触发器,红色框表示必须删除的值。 最后我们将有:

最终目标是获取如下dataframe:

是否可以在 pandas 中以一种有效的方式(不使用 for 循环)做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用带有布尔索引的np.where 来提取第一个匹配条件的值的位置索引。然后将此反馈给iloc

    idx = np.where(df['B'].gt(0.5))[0][0]
    res = df.iloc[:idx+1]
    
    print(res)
    
       A     B
    0  1  0.40
    1  5  0.43
    2  4  0.59
    

    对于可能在早期满足条件的非常大的数据帧,更优化的方法是使用 next 和生成器表达式来计算 idx

    idx = next((idx for idx, val in enumerate(df['B']) if val > 0.5), len(df.index))
    

    要获得更好的性能,请参阅Efficiently return the index of the first value satisfying condition in array

    【讨论】:

      【解决方案2】:

      因此,如果您的索引与您的 iloc 相同,则此方法有效:

      first_occurence = initial_df[initial_df.B>0.5].index[0]
      initial_df.iloc[:first_occurence+1]
      

      编辑:这是一个更通用的解决方案

      first_occurence = initial_df.index.get_loc(initial_df[initial_df.B>0.5].iloc[0].name)
      final_df = initial_df.iloc[:first_occurence+1]
      

      【讨论】:

      • 这可行,但它不是通用解决方案,因为取决于索引。如果是日期时间类型,则不起作用
      • 我添加了一个更通用的解决方案
      【解决方案3】:

      我找到了类似jpp所示的解决方案:

      indices = initial_df.index
      trigger = initial_df[initial_df.B > 0.5].index[0]
      initial_df[initial_df.index.isin(indices[indices<=trigger])]
      

      由于真正的数据框有多个索引,这是我找到的唯一解决方案。

      【讨论】:

        【解决方案4】:

        我假设您要删除“B”列值小于 0.5 的所有行。

        试试这个:

        initial_df = pd.DataFrame([[1, 0.4], [5, 0.43], [4, 0.59], [11, 0.41], [9, 0.61]], columns=['A', 'B'])
        
        final_df = initial_df[initial_df['B'] >= 0.5]
        

        生成的数据帧,final_df 为:

           A     B
        2  4  0.59
        4  9  0.61
        

        【讨论】:

        • 不,我们想要的结果是显示的,和你的不一样。
        • 是基于“B”列还是“A”列。给定所需的输出,看起来可以这样做: final_df = initial_df[initial_df['A']
        猜你喜欢
        • 1970-01-01
        • 2021-07-30
        • 2021-01-07
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 2020-06-25
        • 1970-01-01
        • 2019-08-13
        相关资源
        最近更新 更多