删除特定值之前的第一行

2024-10-02 08:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: importpandasdfdatevalueasassetmax
2条回答

这应该可以做到:

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

你不需要apply。Groupby on boolean series创建用于切片所需输出的掩码。作为您的新要求,每个组在不同的max_value上切片。您需要使用Assetmax_value_list的唯一值创建一个字典,并将其映射到Asset列以创建一系列s的max_值。最后,将Monthly Values和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

相关问题 更多 >

    热门问题