【问题标题】:How to Create New Column in Pandas?如何在 Pandas 中创建新列?
【发布时间】:2021-09-11 17:35:45
【问题描述】:

我需要在 pandas 数据框中创建新列。

df 

Id    Value       
1     >45%         
2     >29%        
3     <30 to >69    
4     >40% to <56% 
5     -- 

df_output:

Id    Value         Value2
1     >45%          45%
2     >29%          29%
3     <30 to >69    69
4     >40% to <56%  56%
5     --            NaN  

在我的 Dataframe 中有一个名为 Value 的列,我需要在该列的顶部创建新列“Value2”。在 Value2 列中,我只需要一个基于 value 列的带后缀的数字(如果存在于 value 列中)。如果有多个像 Id 3&4 这样的数字,我需要其中最高的一个。

我试过了:

df.Value.str.extract('(\d+)')

但它只提取数字。

【问题讨论】:

  • James,还有&lt;80% and &gt;16%这样的字符串吗?

标签: python regex pandas string


【解决方案1】:

你可以使用

import pandas as pd
import numpy as np
import re

df = pd.DataFrame({'Value':['>45%', '<30 to >69', '<80% and >16%', '...']})
def lookup(x):
    m = list(re.finditer(r'(\d+(?:\.\d+)?)\s*%?', x))
    if m:
        return max(m, key=lambda x: float(x.group(1)))[0]
    else:
        return np.nan

df['Value2'] = df['Value'].apply(lookup)
# >>> df
#            Value Value2
# 0           >45%    45%
# 1     <30 to >69     69
# 2  <80% and >16%    80%
# 3            ...    NaN

详情

  • 使用re.finditer,获取(\d+(?:\.\d+)?)\s*%? 模式的所有匹配项,该模式提取一个或多个数字,后跟. 和一个或多个数字的可选序列(将此值捕获到组1),然后是可选的% 签到
  • lookup(x) 方法如果没有找到匹配项,则返回 np.NaN,否则返回包含第 1 组中最大数字的匹配值。

正则表达式详细信息

  • (\d+(?:\.\d+)?) - 第 1 组:一位或多位数字后跟可选的 . 和一位或多位数字(整数或浮点数
  • \s* - 零个或多个空格
  • %? - 可选的 % 符号

请参阅regex demo

【讨论】:

  • 感谢您的解决方案,当数字写成 13 % ---> 13 时,它只获取数字,我们可以更改 RE 以便它可以检测数字和 % 之间的空格。
  • @JamesLin 是的,添加一个\s*
  • 我们如何用这个表达式提取负值,如果我们有 -0.36 它给出 0.36,它缺少负号。
  • @JamesLin re.finditer(r'(-?\d+(?:\.\d+)?)\s*%?', x)
【解决方案2】:

这应该也可以:

df['Value2'] = df['Value'].str.split(r'[<>]').str[-1]

【讨论】:

    【解决方案3】:

    您可以在 Pandas 中使用以下代码。使用所示样本进行编写和测试。使用 Pandas 的df.str.extract 功能。

    df["Value2"] = df['Value'].str.extract('[<>](\d+[%]?$)', expand=False)
    

    DataFrame 的 Value2 列的输出如下:

    df["Value2"]
    0   45%
    1   29%
    2   69
    3   56%
    

    正则表达式的解释: 匹配&lt;&gt; 后跟1 个或多个数字后跟值末尾的%(可选);在捕获组中。

    【讨论】:

      【解决方案4】:
      df['Value2'] = df['Value'].str.extract(r'(\d+%?)$', expand=False)
      

      此模式将匹配字符串末尾的数字序列,末尾有或没有百分号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 1970-01-01
        • 2018-01-23
        • 2015-12-08
        • 2022-11-27
        • 2021-10-09
        • 2020-08-21
        相关资源
        最近更新 更多