【问题标题】:How to create column based on other column and probably using regex in pandas?如何基于其他列创建列并可能在熊猫中使用正则表达式?
【发布时间】:2022-01-06 11:54:51
【问题描述】:

df:

Id   Product_description     Vol
100  Oil 32cmX36cmx25cm 1s   1  
101  Oil 32cmX36cmx30cm 1M   1
102  bag 45cmx3f 1s          1
103  bag 45cmx32f 2L         2
104  BAG 45cmx32f 3 L        3
105  BELT 135L 50S           50
106  BELT 194L 50S           NaN
107  BELT 194L 50 L#144      NaN
108  BELT L                  NaN

我需要在这里做两件事:

  1. 从 Vol 列替换 NaN。(最后一位数字后跟单位,如“L”、“S”)
  2. 根据 Vol & Product_description 列创建另一个列“Unit”。

输出:

Id   Product_description     Vol  Unit(Check Vol and get Unit from Product_description)
100  Oil 32cmX36cmx25cm 1s   1     s 
101  Oil 32cmX36cmx30cm 1M   1     M
102  bag 45cmx3f 1s          1     s
103  bag 45cmx32f 2L         2     L
104  BAG 45cmx32f 3 L        3     L
105  BELT 135L 50S           50    S
106  BELT 194L 50S           50    S
107  BELT 194L 50 L#144      50    L
107  BELT L                  NaN   NaN

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    您可以使用带有命名捕获组的正则表达式,extractall 获取所有匹配项,groupby+last 保留最后一个匹配项,然后将 join 保留到原始数据帧:

    (df
     .drop(columns='Vol')
     .join(df['Product_description']
          .str.extractall('(?P<Vol>\d+)\s*(?P<Unit>[a-zA-Z]+)')
          .groupby(level=0).last()
          )
    )
    

    输出:

        Id    Product_description  Vol Unit
    0  100  Oil 32cmX36cmx25cm 1s    1    s
    1  101  Oil 32cmX36cmx30cm 1M    1    M
    2  102         bag 45cmx3f 1s    1    s
    3  103        bag 45cmx32f 2L    2    L
    4  104       BAG 45cmx32f 3 L    3    L
    5  105          BELT 135L 50S   50    S
    6  106          BELT 194L 50S   50    S
    7  107     BELT 194L 50 L#144   50    L
    8  108                 BELT L  NaN  NaN
    

    注意。以上忽略了原始的“Vol”列,只是从头开始再次提取数据。如果您不想覆盖可能不同的值(尽管它们与字符串不匹配),您可以这样做:

    df2 = (df['Product_description']
          .str.extractall('(?P<Vol>\d+)\s*(?P<Unit>[a-zA-Z]+)')
          .groupby(level=0).last()
          )
    df.combine_first(df2)
    

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2019-10-19
      • 2021-11-06
      • 2022-07-26
      • 1970-01-01
      • 2018-06-23
      • 2021-06-01
      • 2016-12-31
      • 1970-01-01
      相关资源
      最近更新 更多