【问题标题】:How to filter rows containing a similar pattern如何过滤包含相似模式的行
【发布时间】:2020-02-19 14:28:33
【问题描述】:

我在 pandas 中有这个数据框:

               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”。在这种情况下,第二行的“值”新值(因为索引的第 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

【问题讨论】:

  • 你有多少这样的行?如果少于 10000,则执行双循环。如果它们小于 1000000,则按日期分组,然后应用双循环来比较子 DataFrame 上的各个行。
  • 我有 400 行,其中 5 对具有相似的模式和相同的日期值。我是 pandas 的新手,请问你能写代码吗?顺便说一句,我的 df 有超过 2 列,但它们无关紧要

标签: python pandas dataframe


【解决方案1】:

你可以用这个:

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

【讨论】:

    【解决方案2】:

    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() 对我不起作用。

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 2018-02-12
      • 2021-05-17
      • 1970-01-01
      • 2019-02-21
      • 2014-01-27
      • 2022-11-02
      • 2012-02-06
      相关资源
      最近更新 更多