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

Python 删除特定值之前的第一行-删除,python,pandas,Python,Pandas,我试图删除组初始值之前的所有行。例如,如果mymax_value=250,则应删除该值之前组的所有行。如果该组的CONSEQUATIVE值再次显示为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', '

我试图删除组初始值之前的所有行。例如,如果my
max_value=250
,则应删除该值之前组的所有行。如果该组的CONSEQUATIVE值再次显示为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_值
为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

这应该可以做到:

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))]

您不需要
应用
。Groupby on boolean series创建用于切片所需输出的掩码。作为您的新要求,每组在不同的
最大值上切片。您需要使用
Asset
max\u value\u list
的唯一值创建一个字典,并将其映射到
Asset
列以创建一系列
s
最大值。最后,将
Monthly Value
s
和groupby
cumsum
进行比较,创建用于切片的掩码
m
。(注意:我将样本更改为不同的值,以在不同的
最大值上显示切片


谢谢你的回答-它对我的代理数据非常有效。我遗漏的一点是,每个组(资产)(列表或列)都有一个max_值。如果
max\u value\u list=[250300],我无法将其替换为公式中的
max\u value`。任何帮助都将不胜感激。很酷的解决方案。只需将“gt”改为“isin”@sammywemmy:
isin
不起作用。它检查是否相等,而OP检查
gt
更新了我的答案,以说明您的其他情况
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