簡體   English   中英

如何匹配前導和尾隨連字符

[英]How to match leading and trailing hyphen

我有一個 Pandas dataframe ,其十進制值如下所示。 '+' 和 '-' 符號可以是前導也可以是尾隨。

df = pd.DataFrame({'amt': ['11.11', '+22.22', '33.33+', '-44.44', '55.55-', '66.66', '77.77', '8a8', '99', '97-9']})
    
    df['amt']
0     11.11
1    +22.22
2    33.33+
3    -44.44
4    55.55-
5     66.66
6     77.77
7       8a8
8        99
9      97-9
Name: amt, dtype: object

我的要求是:

  1. 刪除前導和尾隨 '+'
  2. 將尾隨 '-' 移動到前導 '-'

這是我到目前為止所做的:

abs_ser = pd.to_numeric(df['amt'].str.strip().str.strip('+|-'), errors='coerce')
abs_ser
0    11.11
1    22.22
2    33.33
3    44.44
4    55.55
5    66.66
6    77.77
7      NaN
8    99.00
9      NaN
Name: amt, dtype: float64

df['clean_amt'] = np.where(df['amt'].str.match(r'(^-|-$)'), abs_ser * -1, abs_ser)
df[['amt', 'clean_amt']]
    amt clean_amt
0   11.11   11.11
1   +22.22  22.22
2   33.33+  33.33
3   -44.44  -44.44
4   55.55-  55.55
5   66.66   66.66
6   77.77   77.77
7   8a8     NaN
8   99      99.00
9   97-9    NaN

正則表達式與結尾的“-”不匹配。 有人可以幫助糾正正則表達式嗎?

我嘗試了以下方法,它給了我想要的結果。 但是,如果它可以在“amt”列的一次傳遞中完成,我更喜歡正則表達式。

df['clean_amt'] = np.where((df['amt'].str.startswith('-') | df['amt'].str.endswith('-')), abs_ser * -1, abs_ser)

您可以使用

abs_ser = pd.to_numeric(df['amt'].str.strip().str.replace(r'^\+|\+$|^(.+)(-)$', r'\2\1'), errors='coerce')

請參閱正則表達式演示

細節

  • ^\+ - 在開頭找到一個+
  • \+$ - 在末尾找到一個+
  • ^(.+)(-)$ - 捕獲字符串開頭的任何一個或多個字符(將文本捕獲到第 1 組),然后將字符串末尾的-捕獲到第 2 組。

替換是串聯的第 2 組和第 1 組值。

您可以執行以下操作:

# strip +
df['amt'] = df['amt'].str.strip('+')

# move -
mask = df['amt'].str.contains('-$')
df.loc[mask, 'amt'] = '-' + df.loc[mask, 'amt'].str.rstrip('-')

# transform to numeric
res = pd.to_numeric(df['amt'], errors='coerce')

print(res)

Output

0    11.11
1    22.22
2    33.33
3   -44.44
4   -55.55
5    66.66
6    77.77
7      NaN
8    99.00
9      NaN
Name: amt, dtype: float64

暫無
暫無

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

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