Pandas 根据另一列中关键字字符串的第一次出现创建列

问题描述 投票:0回答:2

我不确定这个问题有多具有挑战性,但这是我的问题:

我有一个数据框如下:

         df-in 

      ColA      ColB        ColC     ColD

      PA         1           2         c
      PB         3           3         d
      PA         5           11        x
      Ind1 Suma   20          14        z  
      QA         3            7        a
      QB         3            7        b 
      QC         5            8        c
      QD         5            12       c
     Ind2 Dat   202           3        y
      RA        12            1        a
      RB        13            1        v
      RC        14            1        q
     Ind3 CapT  120           3        t
     Other      10            4        x

所以现在的问题是,我要做的是创建一个列(例如 ColN),该列仅包含指标值(ColA 中的 Ind1 或 Ind2 或 Ind3),但遵循以下规则:ColN 将包含所有 Ind1直到 ColA 具有 Ind1 值、Ind2、Ind1 和 Ind2 之间以及 Ind3 位于 Ind3 和 Ind2 之间。

(这里只是强调一下,Ind1,Ind2,Ind3可以是不同的字符串,如'star','planet','moon',但它们将永远保持不变。它们不会改变)

所以我的输出 df 将如下所示:

  df-out

      ColA      ColB        ColC     ColD       ColN

      PA         1           2         c        Ind1
      PB         3           3         d        Ind1
      PA         5           11        x        Ind1
      Ind1 Suma   20          14       z        Ind1
      QA         3            7        a        Ind2
      QB         3            7        b        Ind2
      QC         5            8        c        Ind2
      QD         5            12       c        Ind2
     Ind2 Dat   202           3        y        Ind2
      RA        12            1        a        Ind3
      RB        13            1        v        Ind3
      RC        14            1        q        Ind3
     Ind3 CapT  120           3        t        Ind3
     Other      10            4        x        Ind3

那么我怎样才能实现这一目标呢?我正在尝试迭代 ColA 或尝试将其放入列表中并尝试,但似乎没有任何效果。任何帮助将不胜感激。

python pandas multiple-columns calculated-columns indicator
2个回答
0
投票

使用

pd.Series.where
(替换非指标值)和
pd.Series.bfill
用于向后填充:

df['ColN'] = df['ColA'].where(df['ColA'].str.startswith('Ind')).bfill()

         ColA  ColB  ColC ColD       ColN
0          PA     1     2    c  Ind1 Suma
1          PB     3     3    d  Ind1 Suma
2          PA     5    11    x  Ind1 Suma
3   Ind1 Suma    20    14    z  Ind1 Suma
4          QA     3     7    a   Ind2 Dat
5          QB     3     7    b   Ind2 Dat
6          QC     5     8    c   Ind2 Dat
7          QD     5    12    c   Ind2 Dat
8    Ind2 Dat   202     3    y   Ind2 Dat
9          RA    12     1    a  Ind3 CapT
10         RB    13     1    v  Ind3 CapT
11         RC    14     1    q  Ind3 CapT
12  Ind3 CapT   120     3    t  Ind3 CapT
13      Other    10     4    x        NaN

您可以为

where
设置另一个条件,具体取决于您的实际指标值模式。


0
投票

您可以使用

str.extract
bfill
,也可以选择使用
ffill

df['ColN'] = df['ColA'].str.extract('(Ind\S+)', expand=False).bfill().ffill()

输出:

         ColA  ColB  ColC ColD  ColN
0          PA     1     2    c  Ind1
1          PB     3     3    d  Ind1
2          PA     5    11    x  Ind1
3   Ind1 Suma    20    14    z  Ind1
4          QA     3     7    a  Ind2
5          QB     3     7    b  Ind2
6          QC     5     8    c  Ind2
7          QD     5    12    c  Ind2
8    Ind2 Dat   202     3    y  Ind2
9          RA    12     1    a  Ind3
10         RB    13     1    v  Ind3
11         RC    14     1    q  Ind3
12  Ind3 CapT   120     3    t  Ind3
13      Other    10     4    x  Ind3
© www.soinside.com 2019 - 2024. All rights reserved.