代码之家  ›  专栏  ›  技术社区  ›  Starbucks

删除特定值前的第一行-0

  •  2
  • Starbucks  · 技术社区  · 5 年前

    max_value = 250 ,则应删除该值之前组的所有行。如果该组的Consequity值再次显示为250或更小,则不会将其删除。

    import pandas as pd
    df = pd.DataFrame({
        'date': ['2019-01-01','2019-02-01','2019-03-01', '2019-04-01',
                 '2019-01-01','2019-02-01','2019-03-01', '2019-04-01',
                 '2019-01-01','2019-02-01','2019-03-01', '2019-04-01'],
        'Asset': ['Asset A', 'Asset A', 'Asset A', 'Asset A', 'Asset A', 'Asset A', 'Asset B', 'Asset B',
                 'Asset B', 'Asset B', 'Asset B', 'Asset B'],
        'Monthly Value': [100, 200, 300, 400, 500, 600, 100, 200, 300, 200, 300, 200]
    })
    
    unique_list = list(df['Asset'].unique())
    max_value = 250
    print(df)
    
              date    Asset  Monthly Value
    0   2019-01-01  Asset A            100
    1   2019-02-01  Asset A            200
    2   2019-03-01  Asset A            300
    3   2019-04-01  Asset A            400
    4   2019-01-01  Asset A            500
    5   2019-02-01  Asset A            600
    6   2019-03-01  Asset B            100
    7   2019-04-01  Asset B            200
    8   2019-01-01  Asset B            300
    9   2019-02-01  Asset B            200
    10  2019-03-01  Asset B            300
    11  2019-04-01  Asset B            200
    

    max_value 是250,那么数据帧应该如下所示(如下所示)。请注意,第一次为组检测到小于250的值时,所有这些行都将被删除。如果再次显示值250或更高,则保留该值。任何帮助都将不胜感激。

              date    Asset  Monthly Value
    2   2019-03-01  Asset A            300
    3   2019-04-01  Asset A            400
    4   2019-01-01  Asset A            500
    5   2019-02-01  Asset A            600
    8   2019-01-01  Asset B            300
    9   2019-02-01  Asset B            200
    10  2019-03-01  Asset B            300
    11  2019-04-01  Asset B            200
    
    1 回复  |  直到 5 年前
        1
  •  5
  •   rahlf23    5 年前

    这应该可以做到:

    df[df.groupby('Asset')['Monthly Value'].apply(lambda x: x.gt(max_value).cumsum().ne(0))]
    

              date    Asset  Monthly Value
    2   2019-03-01  Asset A            300
    3   2019-04-01  Asset A            400
    4   2019-01-01  Asset A            500
    5   2019-02-01  Asset A            600
    8   2019-01-01  Asset B            300
    9   2019-02-01  Asset B            200
    10  2019-03-01  Asset B            300
    11  2019-04-01  Asset B            200
    

    另外,如果你把你的最大值存储在字典里,比如 max_value = {'Asset A': 250, 'Asset B': 250} ,可以执行以下操作以获得相同的结果:

    df[df.groupby('Asset')['Monthly Value'].apply(lambda x: x.gt(max_value[x.name]).cumsum().ne(0))]
    
        2
  •  2
  •   Andy L.    5 年前

    你不需要 apply . Groupby on boolean series以创建用于切片所需输出的掩码。作为你的新要求,每个小组在不同的 max_value Asset max_value_list 并将其映射到 资产 s 最大值。最后,比较 Monthly Value s码 和groupby cumsum m 注意 : 我把你的样品改成不同的值来显示不同的切片 max_values )

    Modified sample `df` to show slicing on different max_value
    
    Out[334]:
              date    Asset  Monthly Value
    0   2019-01-01  Asset A            100
    1   2019-02-01  Asset A            200
    2   2019-03-01  Asset A            300
    3   2019-04-01  Asset A            400
    4   2019-01-01  Asset A            500
    5   2019-02-01  Asset A            600
    6   2019-03-01  Asset B            100
    7   2019-04-01  Asset B            350
    8   2019-01-01  Asset B            450
    9   2019-02-01  Asset B            200
    10  2019-03-01  Asset B            300
    11  2019-04-01  Asset B            200
    
    max_value_list = [250, 300]
    max_dict = dict(zip(df.Asset.unique(), max_value_list))
    s = df.Asset.map(max_dict)
    m = (df['Monthly Value'] > s).groupby(df.Asset).cumsum().ne(0)
    df[m]
    
    Out[333]:
              date    Asset  Monthly Value
    2   2019-03-01  Asset A            300
    3   2019-04-01  Asset A            400
    4   2019-01-01  Asset A            500
    5   2019-02-01  Asset A            600
    7   2019-04-01  Asset B            350
    8   2019-01-01  Asset B            450
    9   2019-02-01  Asset B            200
    10  2019-03-01  Asset B            300
    11  2019-04-01  Asset B            200