删除特定值之前的第一行 - 熊猫

Sta*_*cks 3 python pandas

我试图在组的初始值之前删除所有行。例如,如果 my max_value = 250,则应删除该值之前的组的所有行。如果该组再次出现 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
Run Code Online (Sandbox Code Playgroud)

如果阈值或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
Run Code Online (Sandbox Code Playgroud)

rah*_*f23 5

这应该可以解决问题:

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

产量:

          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
Run Code Online (Sandbox Code Playgroud)

此外,如果您将最大值存储在类似 的字典中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))]
Run Code Online (Sandbox Code Playgroud)

  • 更新了我的答案以考虑您的附加条件 (3认同)
  • @sammywemmy:“isin”不起作用。它检查相等性,而 OP 检查“gt” (2认同)