如何过滤包含相似模式的行

时间:2020-02-19 14:28:33

标签: python pandas dataframe

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

               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)的前9个字符与“日期”列的值相同,如何获取“值”列之间的差(减)。将在第10个字符上带有“ T”和第10个字符上带有“ A”的索引之间进行减法运算。

例如第一个索引和第二个索引的前9个字符是“ TR010213”,“日期”值是“ 2019-11-15”。在这种情况下,第二行的“值”的新值(因为索引的第10个字符为“ T”)应为90(100-10),而第一行的“值”(索引的第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

2 个答案:

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

答案 1 :(得分:1)

IIUC,您可以使用ECHO OFF CLS :MENU ECHO. ECHO ............................................... ECHO PRESS 1 or 2 to select your task, or 4 to EXIT. ECHO ............................................... ECHO. ECHO 1 - Test ECHO 2 - Production ECHO 4 - EXIT ECHO. CHOICE /C:124 IF ERRORLEVEL 1 SET M=1 IF ERRORLEVEL 2 SET M=2 IF ERRORLEVEL 4 SET M=4 IF %M%==1 GOTO TEST IF %M%==2 GOTO PROD IF %M%==4 GOTO EOF :TEST ECHO TEST cd %~dp0\Test\ start Test.exe GOTO MENU :PROD ECHO PROD cd %~dp0\Production\ start Production.exe GOTO MENU 来获取前9个字符,并使用df.index.str[: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 对我不起作用。