如何筛选包含类似模式的行

2024-09-30 18:17:52 发布

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

我在熊猫中有这个数据帧:

               Value    Date
ISIN        
TRT010213A15    10    2019-11-15
TRT010213T23    100   2019-11-15
TRT010213T23    70    2019-12-20
TRT080328T15    150   2018-10-12
TRT080420T12    175   2018-05-11
TRT150120T16    150   2019-08-29
TRT150120A05    15    2019-11-18
TRT150120T16    300   2019-10-15
TRT150120T16    275   2019-11-18

如果索引的前9个字符(“ISIN”)和值相同,如何获得“值”列之间的差(减法)​​在“日期”列中,日期是相同的。减法将在第10个字符上有“T”和第10个字符上有“A”的索引之间进行

例如,第一和第二索引的前9个字符为“TR010213”,“日期”值为“2019-11-15”。在这种情况下,第二行的“value”的新值(因为索引的第10个字符是“T”)应该是90(100-10),而第一行的“value”(索引的第10个字符是“A”)将不会更改

我想得到这个数据帧:

                Value   Date
ISIN        
TRT010213A15    10  2019-11-15
TRT010213T23    90  2019-11-15
TRT010213T23    70  2019-12-20
TRT080328T15    150 2018-10-12
TRT080420T12    175 2018-05-11
TRT150120T16    150 2019-08-29
TRT150120A05    15  2019-11-18
TRT150120T16    300 2019-10-15
TRT150120T16    260 2019-11-18

Tags: 数据datevalue情况个字符新值isintrt150120a05
2条回答

你可以用这个:

df.update(df.groupby([df.index.str[:9],'Date']).transform('diff'))

              Value        Date
ISIN                           
TRT010213A15   10.0  2019-11-15
TRT010213T23   90.0  2019-11-15
TRT010213T23   70.0  2019-12-20
TRT080328T15  150.0  2018-10-12
TRT080420T12  175.0  2018-05-11
TRT150120T16  150.0  2019-08-29
TRT150120A05   15.0  2019-11-18
TRT150120T16  300.0  2019-10-15
TRT150120T16  260.0  2019-11-18

IIUC,您可以使用df.index.str[:9]获取前9个字符,并且groupby().shift()

df['Value'] -= df.groupby([df.index.str[:9], df['Date']]).Value.shift().fillna(0)

输出:

              Value        Date
ISIN                           
TRT010213A15   10.0  2019-11-15
TRT010213T23   90.0  2019-11-15
TRT010213T23   70.0  2019-12-20
TRT080328T15  150.0  2018-10-12
TRT080420T12  175.0  2018-05-11
TRT150120T16  150.0  2019-08-29
TRT150120A05   15.0  2019-11-18
TRT150120T16  300.0  2019-10-15
TRT150120T16  260.0  2019-11-18

注意:出于某种原因,groupby().diff()对我不起作用

相关问题 更多 >