簡體   English   中英

使用 pandas 基於正則表達式分離列數據

[英]Segregate a column data based on regex using pandas

我有一個 dataframe 如下圖所示

df = pd.DataFrame({'val': ['>1234','<>','<1000','<test','31sadj',123,43.21]})

我想創建 3 個新列

val_num - 將僅存儲 NUMBER 個值以及符號 ex:1234(來自 >1234)和 1000(來自 <1000)但不會存儲 31(來自 31sadj),因為它沒有任何符號

val_str - 將僅存儲NUMBERsymbolsALPHABETS或純字母組合的值,例如:31sadj。 它可以有除><=之外的任何符號

val_symbol - 將僅存儲 3 個符號,例如><=

我嘗試了以下但不准確

df['val_SYMBOL'] = df['val'].str.extract(r'([<>=]+)').fillna('=')
df['val_num'] = df['val'].str.extract(r'([0-9]+)')
df['val_str'] = df['val'].str.extract(r'([a-zA-Z0-9\s-]+)') 

我希望我的 output 如下所示

在此處輸入圖像描述

您可以使用

df['val_SYMBOL'] = df['val'].astype(str).str.extract(r'([<>=]+)').fillna('=')
df['val_num'] = df['val'].astype(str).str.extract(r'\b(\d+(?:\.\d+)?)\b')
df['val_str'] = df['val'].astype(str).str.extract(r'([^<>=]*[a-zA-Z][^<>=]*)')

您想處理混合數據類型列,因此第一個操作是使用astype(str)將數據轉換為字符串。

val_num列填充有\b(\d+(?:\.\d+)?)\b匹配、integer 或作為整個單詞匹配的浮點數( \b代表單詞邊界)。

val_str列填充有([^<>=]*[a-zA-Z][^<>=]*)匹配項,它搜索除<>=之外的零個或多個字符,然后是一個字母和然后又是<>=以外的零個或多個字符。

output 我得到:

>>> df
      val val_SYMBOL val_num val_str
0   >1234          >    1234     NaN
1      <>         <>     NaN     NaN
2   <1000          <    1000     NaN
3   <test          <     NaN    test
4  31sadj          =     NaN  31sadj
5     123          =     123     NaN
6   43.21          =   43.21     NaN

Series.str.extract

我們可以將extract與包含三個捕獲組的正則表達式模式一起使用。

df['val'].astype(str).str.extract(
    r'([<>=]+)?((?<=[<>=])\d+\.?\d*|\d+\.?\d*(?=$))?(.+)?').fillna({0: '='})

    0      1       2
0   >   1234     NaN
1  <>    NaN     NaN
2   <   1000     NaN
3   <    NaN    test
4   =    NaN  31sadj
5   =    123     NaN
6   =  43.21     NaN

正則表達式詳細信息

  • ([<>=]+)? : 第一個捕獲組匹配零次或一次

    • [<>=]+ : 匹配列表中的一個或多個字符[<>=]
  • ((?<=[<>=])\d+\.?\d*|\d+\.?\d*(?=$))? :: 第二個捕獲組匹配零次或一次

    • (?<=[<>=])\d+\.?\d* :第一種選擇
      • (?<=[<>=])\d+\.?\d* :匹配列表[<>=]中出現的符號之后的數字
    • \d+\.?\d*(?=$) :第二個選擇匹配行尾的數字
  • (.+)? : 第三個捕獲組匹配零次或一次

    • .+ :匹配任何字符一次或多次。

See the online regex demo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM