![](/img/trans.png)
[英]how to segregate monthly average data based on station wise using 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
- 將僅存儲NUMBER
、 symbols
、 ALPHABETS
或純字母組合的值,例如: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*(?=$)
:第二個選擇匹配行尾的數字(.+)?
: 第三個捕獲組匹配零次或一次
.+
:匹配任何字符一次或多次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.