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

时间:2020-01-18 01:25:48

标签: python pandas

我正在尝试删除组初始值之前的所有行。例如,如果我的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

如果阈值或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

2 个答案:

答案 0 :(得分: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))]

答案 1 :(得分:2)

您不需要@code{ protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await JSRuntime.InvokeVoidAsync("highlightMenu"); } } } 。在布尔系列上使用Groupby创建遮罩以对所需的输出进行切片。作为您的新要求,每个组应切成不同的apply。您需要使用max_valueAsset的唯一值创建字典,并将其映射到max_value_list列以创建一系列Asset的max_values。最后,将sMonthly Value进行比较,并按s分组以创建用于切片的掩码cumsum。 (注意我将您的示例更改为不同的值,以显示在不同的m 上的切片)

max_values